Как использовать скрипт Python для размещения, а затем посетить сервер, не дожидаясь возврата
Я пишу сценарий, который создает HTML-файл, а затем нужно будет разместить его, посетить локальный хост и сделать снимок экрана. Я могу заставить его делать все эти вещи, но единственная проблема в том, что он не будет пытаться сделать снимок экрана, пока не получит ответ от команды, которая запускает сервер. Это означает, что сервер уже будет закрыт. Я пытался решить эту проблему с помощью Asyncio, но все еще не работает. Вот часть кода, с которой у меня проблемы:
async def server():
# host the directory
await os.system ('python -m http.server')
async def screenshot():
# cd to google chrome's default install path and call headless chrome from it
os.chdir("C:\Program Files (x86)\Google\Chrome\Application")
os.system('chrome --headless --disable-gpu --enable-logging --screenshot="{}" --window-size=1920,1080 http://localhost:8000/{}'.format(Path(outpath,'images','{}_thumbnail.png'.format(file)),file))
os.chdir (defaultpath)
return print ('The image has been saved to {}'.format(str(Path(outpath,'images'))))
loop = asyncio.get_event_loop()
os.chdir(outpath)
asyncio.ensure_future(server())
loop.run_until_complete(screenshot())
await
похоже, не работает по команде для запуска сервера. Я также пытался использовать subprocess.call('python -m http.server', creationflags=0x00000008)
так же как subprocess.call('python -m http.server', creationflags=0x00000010)
отсоединить процесс размещения сервера от другой оболочки, но python все еще ждет его возврата, прежде чем продолжить. (В качестве примечания будьте осторожны, если вы решите проверить их, потому что 0x00000008 будет скрыт при запуске, и об этом легко забыть).
Кто-нибудь знает, есть ли способ сделать это одним скриптом, или мне нужно будет создать второе приложение для запуска сервера, пока делается снимок экрана?
2 ответа
Попробуйте использовать потоки для одновременного запуска обеих функций, чтобы серверная функция не блокировала скриншот:
from datetime import datetime
import time, threading
def server():
print("Start Server:", datetime.now())
time.sleep(5)
print("Stopped Server:", datetime.now())
def screenshot():
print("Took Screenshot", datetime.now())
if __name__ == '__main__':
server_thread = threading.Thread(target=server)
screenshot_thread = threading.Thread(target=screenshot)
server_thread.start()
screenshot_thread.start()
server_thread.join()
screenshot_thread.join()
Выше напечатано:
Start Server: 2018-07-18 01:54:54.409359
Took Screenshot 2018-07-18 01:54:54.409359
Stopped Server: 2018-07-18 01:54:59.410503
Вам также может понадобиться отложить вызов функции скриншота, чтобы позволить серверу запуститься, что можно сделать, например, грубо с временной задержкой.
Я думаю, что вы хотите получить снимок, так как подключаете свой URL. не так ли?
Я запускаю следующий код в 3.6 Python. не 2.7 питон.
Потому что я думаю, твой код написан на 2.7 python.
Я надеюсь помочь в вашей проблеме.
import os
import os.path
import sys
import asyncio
import time
defaultpath = "C:\\Temp_Work"
outpath = "C:\\Temp_Work"
async def server():
print('server start')
# host the directory
await os.system ('python -m http.server')
async def screenshot():
print('screenshot start')
# cd to google chrome's default install path and call headless chrome from it
os.chdir("C:\\Program Files (x86)\\Google\\Chrome\\Application")
os.system('chrome.exe --headless --disable-gpu --enable-logging --screenshot="C:\\Temp_Work\\test.jpg" --window-size=1920,1080 http://localhost:8000/good.jpg')
os.chdir (defaultpath)
#return print ('The image has been saved to {}'.format(str(os.path(outpath,'images'))))
return print('screenshot end')
print('app start')
loop = asyncio.get_event_loop()
os.chdir(outpath)
#asyncio.ensure_future(server())
loop.run_until_complete(screenshot())
loop.close()
print('finish')