Запуск pypupeteer во FLASK дает ValueError: сигнал работает только в основном потоке - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь интегрировать pyppeteer в приложение фляги.У меня есть сценарий python, который запускает pyppeteer и делает снимок экрана со страницей. Это рабочий файл, если я запускаю сценарий индивидуально.

ПРОБЛЕМА - тот же сценарий не работает при запускеэто в приложении FLASK.

Я получаю следующую ошибку:

loop.run_until_complete(capture(url, 123123))
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/
Versions/3.7/lib/python3.7/asyncio/base_events.py", 
line 568, in run_until_complete
return future.result()
File "/App-path/flaskr/image_capture/__init__.py", line 6, in capture
browser = await launch()
File "/usr/local/lib/python3.7/site-packages/pyppeteer/launcher.py", 
line 311, in launch
return await Launcher(options, **kwargs).launch()
File "/usr/local/lib/python3.7/site-packages/pyppeteer/launcher.py", 
line 180, in launch
signal.signal(signal.SIGINT, _close_process)
File"/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/
Versions/3.7/lib/python3.7/signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), 
_enum_to_int(handler))
ValueError: signal only works in main thread.

Следующий код используется для захвата скриншота.

async def capture(code_url, codeId):
browser = await launch()
# print('Hello')
page = await browser.newPage()
await page.setContent('<div id="chart-container">ABCD</div>')
# print(await page.content())
await page.addScriptTag({'url':'''{code_url}'''})
await page.waitFor('.animateon')
await page.setViewport({
    'width':await 
page.evaluate('''document.documentElement.clientWidth''') ,
    'height': await 
page.evaluate('''document.documentElement.clientHeight'''),
    'deviceScaleFactor': 10,
})
await page.screenshot({'path': '''./temp/screenshot/chart- 
{codeId}.jpg''', 'type': 'jpeg'})
await browser.close()

Следующий кодэтот метод называется:

@app.route('/api/v1/screenshot', methods=["POST"])
def screenShot():
    url = request.form['url']
    loop.run_until_complete(capture(url, 123123))
    return jsonify("Image captured Successfully!")

Я использую асинхронный цикл для обработки функции асинхронного захвата.

Также в соответствии с некоторыми предложениями из вопросов Stackoverflow я отключил режим отладки.

Пожалуйста, предложите, где я иду не так.

Версия Python: 3.7

1 Ответ

0 голосов
/ 04 января 2019

Вам нужно вызвать запуск с отключенной обработкой сигналов,

browser = await launch(
    handleSIGINT=False,
    handleSIGTERM=False,
    handleSIGHUP=False
)
...