Как использовать скрипт 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')
Другие вопросы по тегам