我正在编写一个脚本,该脚本创建一个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在运行时将被隐藏,很容易忘记)。
有人知道是否可以使用一个脚本来执行此操作吗?还是我必须创建第二个应用程序才能在截屏时运行服务器?
答案 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')