我正在编写一个创建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在运行时将被隐藏,并且很容易被忘记)。
有没有人知道有没有办法让一个脚本来做这件事,或者在截图的同时我必须创建第二个应用程序来运行服务器?
发布于 2018-07-18 09:02:59
考虑使用线程同时运行这两个函数,这样服务器函数就不会阻塞截图:
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
您可能还需要延迟屏幕截图函数调用,以允许服务器启动,例如,您可以通过时间延迟来粗略地执行此操作。
发布于 2018-07-18 09:55:17
我认为你想要得到一个快照作为连接拥有你的网址。不是吗?
我在3.6python中运行以下代码。不是2.7python。
因为我认为,您的代码是用2.7python编写的。
我希望对你的问题有所帮助。
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')
https://stackoverflow.com/questions/51391795
复制相似问题