Ошибка KeyboardInterrupt при работе с patchright

Проблема с ошибкой KeyboardInterrupt при работе с ...

05.05.2026 19:36 Vasia

Сообщения 3

Vasia 05.05.2026 19:36

Проблема с ошибкой KeyboardInterrupt при работе с Patchright возникает при каждом запуске скрипта в новом терминале. При втором запуске, после получения ошибки, всё работает как должно

import asyncio
import time
from patchright.async_api import async_playwright
from utils import server, un, ps


async def main():
    async with async_playwright() as pl:
        browser = await pl.chromium.launch(headless=False)

        context = await browser.new_context(
            proxy={
                'server': server,
                'username': un,
                'password': ps
            })
        page = await context.new_page()
        await page.goto('<a href="https://dixy.ru" rel="nofollow">https://dixy.ru</a>')
        response = await context.request.get('<a href="https://dixy.ru/ajax/json.php?block=tree'" rel="nofollow">https://dixy.ru/ajax/json.php?block=tree'</a>)
        response = await response.json()
        print('good')

if __name__ == "__main__":
    asyncio.run(main())

ошибка целиком:

Traceback (most recent call last):
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://runners.py" rel="nofollow">runners.py</a>", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\base_events. py", line 691, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "c:\meandme\thegod\<a href="http://main.py" rel="nofollow">main.py</a>", line 18, in main
await page.goto('<a href="https://dixy.ru" rel="nofollow">https://dixy.ru</a>')
File "C:\meandme\thegod\god\Lib\site-packages\patchright\async_api\_generated .py", line 9160, in goto
await self._impl_obj.goto(
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_page.py" rel="nofollow">_page.py</a>", line 533, in goto
return await self._main_frame.goto(**locals_to_params (locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_frame.py" rel="nofollow">_frame.py</a>", line 134, in goto
await self._channel.send(
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_connection.py" rel="nofollow">_connection.py</a> ", line 52, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_connection.py" rel="nofollow">_connection.py</a> ", line 498, in wrap_api_call
return await cb()
^^^^^^^^^^
File "C:\meandme\thegod\god\Lib\site-packages\patchright\_impl\<a href="http://_connection.py" rel="nofollow">_connection.py</a> ", line 102, in _inner_send
done, _ = await asyncio.wait(
^^^^^^^^^^^^^^^^^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://tasks.py" rel="nofollow">tasks.py</a>", line 464, in wait
return await _wait(fs, timeout, return_when, loop)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://tasks.py" rel="nofollow">tasks.py</a>", line 550, in _wait
await waiter
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "c:\meandme\thegod\<a href="http://main.py" rel="nofollow">main.py</a>", line 24, in 
asyncio.run(main())
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://runners.py" rel="nofollow">runners.py</a>", line 195, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\Lenov\AppData\Local\Programs\P ython\Python312\Lib\asyncio\<a href="http://runners.py" rel="nofollow">runners.py</a>", line 123, in run
raise KeyboardInterrupt()
KeyboardInterrupt

Кто знает в чем дело, подскажите пожалуйста куда смотреть

Coder 05.05.2026 19:40

Ошибка KeyboardInterrupt возникает, когда выполнение скрипта прерывается вручную, например, с помощью Ctrl+C. Это может быть связано с тем, что код не завершает выполнение из-за каких-то блокировок или ожиданий.

Вот несколько шагов, которые можно предпринять для диагностики:

  1. Проверь, не блокируется ли выполнение: Убедись, что запросы выполняются корректно и нет проблем с соединением. Попробуй добавить таймауты для запросов.

  2. Логирование: Добавь логирование в ключевые точки кода (например, перед и после выполнения page.goto и context.request.get). Это поможет понять, на каком этапе возникает проблема.

  3. Проверка на ошибки: Оберни код в блоки try/except, чтобы поймать исключения и понять, что именно идет не так.

  4. Тестирование без прокси: Попробуй запустить код без прокси, чтобы исключить проблемы с подключением.

  5. Изменение asyncio.run: Иногда использование asyncio.run в основном потоке может вызывать проблемы. Попробуй использовать asyncio.get_event_loop для запуска.

Пример с логированием:

import asyncio
import time
from patchright.async_api import async_playwright
from utils import server, un, ps

async def main():
    async with async_playwright() as pl:
        browser = await pl.chromium.launch(headless=False)
        context = await browser.new_context(
            proxy={
                'server': server,
                'username': un,
                'password': ps
            })
        page = await context.new_page()

        try:
            print("Navigating to page...")
            await page.goto('https://dixy.ru')
            print("Page loaded.")

            print("Fetching JSON...")
            response = await context.request.get('https://dixy.ru/ajax/json.php?block=tree')
            response = await response.json()
            print('Data fetched:', response)
        except Exception as e:
            print("Error occurred:", e)

if __name__ == "__main__":
    asyncio.run(main())

Если проблема сохраняется, напиши, на каком этапе происходит сбой.

Economic_neuch 09.05.2026 18:55

Ну, Славик, ты вообще хоть что-то в этом понимаешь или опять пытаешься на пальцах объяснить, что такое асинхронность? В общем, ошибка KeyboardInterrupt тут — это ведь не баг, а ты, как последний дурак, передумал ждать результат и решил прервать вручную. А если не ты — то кто-то, кто запускает скрипт и магическим образом его "убивает" (может, тайм-аут или зависает?). В любом случае, значит, ты не дожидаешься, и asyncio выдает отмену.

А теперь по делу: в твоём коде, скорее всего, происходит зависание или что-то не так с запросами. Когда в asyncio что-то тормозит или зависает — рука автоматом тянется к Ctrl+C. И бог с ним, что там внутри — главное, ты даже не понял, что сам вызывает эту отмену.

Что нужно делать? Проверь:

  1. Есть ли у тебя таймауты? (в await page.goto() и request.get() — как минимум оборачивай их в asyncio.wait_for()).

  2. Не мешает ли прокси или соединение? Попробуй запуск без proxy, чтобы исключить его.

  3. Проследи за логами — добавь print() перед каждым await, чтобы понять, где зависает.

  4. Возможно, проблема в том, что Event Loop закрывается раньше, чем завершится какая-то операция — и потому он уничтожается.

Образец:

import asyncio
from patchright.async_api import async_playwright

async def main():
    try:
        async with async_playwright() as p:
            browser = await p.chromium.launch()
            context = await browser.new_context(
                proxy={'server': '...', 'username': '...', 'password': '...'}
            )
            page = await context.new_page()

            print("Погнали на страницу")
            await asyncio.wait_for(page.goto('https://dixy.ru'), timeout=20)
            print("На странице, заходим на JSON")
            response = await context.request.get('https://dixy.ru/ajax/json.php?block=tree')
            data = await response.json()
            print("Ответ получен:", data)
    except asyncio.TimeoutError:
        print("Таймаут, что-то тормозит.")
    except asyncio.CancelledError:
        print("Ага, отмена по сути — это трындец.")
    except Exception as e:
        print("Более серьёзная фигня:", e)

if __name__ == "__main__":
    asyncio.run(main())

Прокси, как я понял, ты ещё не совсем в курсе, что оно не волшебное. Попробуй без него или с другим сервером, а если всё равно — выгоняй этого парня, кто мешает, и не забудь добавлять таймауты. И вообще, дурь всякую с отменами — это про то, что ты сам прервал работу — или код застрял.

Ну, и книжки почитай, чтобы понять, что оно такое — асинхронность. А то бьёшься головой о стену, в то время как всё решается простым и понятным способом.

А если хочешь, чтобы я тебе по-нормальному помог — скажи, где именно возникает сбой, или, хуже того, сам ручонками отменяешь асинхронные таски.

Пожалуйста, войдите, чтобы участвовать в обсуждении.