首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用python脚本托管服务器,然后访问服务器,而无需等待返回

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

Stack Overflow用户
提问于 2018-07-18 08:12:37
回答 2查看 71关注 0票数 0

我正在编写一个创建html文件的脚本,然后需要托管它,访问本地主机,并截图。我可以让它做所有这些事情,但唯一的问题是,在启动服务器的命令返回之前,它不会尝试截取屏幕截图。这意味着服务器将已经关闭。我尝试过使用asyncio解决这个问题,但它似乎仍然不起作用。下面是我遇到问题的代码部分:

代码语言:javascript
复制
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在运行时将被隐藏,并且很容易被忘记)。

有没有人知道有没有办法让一个脚本来做这件事,或者在截图的同时我必须创建第二个应用程序来运行服务器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-18 09:02:59

考虑使用线程同时运行这两个函数,这样服务器函数就不会阻塞截图:

代码语言:javascript
复制
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()

上面打印的内容:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-07-18 09:55:17

我认为你想要得到一个快照作为连接拥有你的网址。不是吗?

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

因为我认为,您的代码是用2.7python编写的。

我希望对你的问题有所帮助。

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51391795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档