如何使用python脚本托管然后访问服务器而无需等待返回

时间:2018-07-18 00:12:37

标签: python server async-await python-asyncio

我正在编写一个脚本,该脚本创建一个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)将服务器托管进程分离到另一个shell,但是python仍然等待它返回后再继续。 (作为一个旁注,如果您决定对它们进行测试,请小心,因为0x00000008在运行时将被隐藏,很容易忘记)。

有人知道是否可以使用一个脚本来执行此操作吗?还是我必须创建第二个应用程序才能在截屏时运行服务器?

2 个答案:

答案 0 :(得分:1)

考虑使用线程同时运行两个功能,这样服务器功能就不会阻止屏幕截图之一:

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

例如,您可能还需要延迟屏幕快照功能调用,以允许服务器启动,例如,您可以粗略地进行设置。

答案 1 :(得分:0)

我认为您想通过连接自己的网址来获取快照。不是吗?

我在3.6 python中运行以下代码。不是2.7 python。

因为我认为您的代码是用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')