gpt4 book ai didi

python - 如何使用Python脚本启动和停止包含 "http.server.serveforever"的Python脚本

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:23 25 4
gpt4 key购买 nike

背景

我有一个名为 server.py 的 Python 3 脚本,它使用内置的 http.server 模块。该脚本归结为以下内容:

from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler

class MyRequestHandler (BaseHTTPRequestHandler):
def do_POST(self):
# Code omitted for brevity

def do_GET(self):
# Code omitted for brevity

def start_server():

# Begin serving
# -------------
server = HTTPServer(('', port), MyRequestHandler)
print("server now running on port {0} ...".format(port))

server.serve_forever()

# Start the Server
# ----------------
if __name__ == '__main__':
start_server()

MyRequestHandler 根据用于请求的 URI,通过“即时”导入模块来处理 GET 和 POST 请求。

上面的工作正常,但是,在创建该脚本之后,需要能够远程更新整个脚本“包”(即服务器脚本,加上所有“模块脚本” “即时”加载并位于子文件夹中)。

为此,我用 Python 3 编写了另一个服务器脚本(称为 updater.py),当收到指令时,它将检索一个 zip 文件,然后解压缩以覆盖原始 server.py 脚本以及所有其他相关脚本和子文件夹。

问题

这一切都很好,但我现在碰壁了。我认为最好的方法是让 updater.py 脚本控制 server.py 的运行。它可以在覆盖之前关闭 server.py 以及链接到它的所有内容,然后在覆盖之后重新启动它。

在此基础上,我走的路是使用 subprocess.Popen 启动服务器,相信我可以在覆盖 server.py 之前杀死 Python 进程 的东西,但是,这并没有像希望的那样工作。这是我编写的用于测试该理论的 trial.py 脚本:

import sys
import subprocess

def main():
def start_process():
proc = subprocess.Popen([sys.executable, 'server.py'])
print("Started process:")
print(proc.pid)
return proc

def kill_process(the_process):
print("Killing process:")
print(the_process.pid)
the_process.kill()

process = None

while True:
user_input = input("Type something: ")

if user_input == 'start':
process = start_process()
if user_input == 'kill':
kill_process(process)
if user_input == 'exit':
break

if __name__ == '__main__':
main()

这确实启动和终止了一个 Python 进程,但是当这个脚本运行时服务器没有运行,所以我不确定它正在启动和终止什么!输入“开始”然后“退出”(从而退出 trial.py 脚本)允许服务器运行,但我不明白为什么,因为我认为 subprocess.Popen 应该使派生进程独立于父进程运行?

编辑:感谢 @Håken Lid 在下面的敏锐观察,我注意到我所做的只是跳出 while 循环,不是 退出脚本。这让我相信 while 循环会以某种方式阻止子进程运行(因为一旦退出循环,服务器就会启动)。

最佳答案

根据我们的讨论,我会推荐一些方法来清空“server.py”中的 stdio 缓冲区。如果您还希望能够提供用户输入,则在等待主线程上的用户输入时,您需要一个线程来进行打印(或者只是将缓冲区清空到黑洞中)。这是我如何做的粗略想法..

import sys
import subprocess
from threading import Thread
#This could probably be solved with async, but I still
#haven't learned async as well as I know threads

def main():

def start_process():
proc = subprocess.Popen([sys.executable, 'server.py'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
print("Started process:")

def buf_readerd(proc, inbuf, outbuf):
while proc.poll() is None:
outbuf.write(inbuf.readline()) #may need to add a newline.. I'm not sure if readline ends in a \n

stdoutd = Thread(target=buf_readerd, args=(proc, proc.stdout, sys.stdout), daemon=True)
stderrd = Thread(target=buf_readerd, args=(proc, proc.stderr, sys.stderr), daemon=True)
stdoutd.start()
stderrd.start()
print("started pipe reader daemons")

print(proc.pid)
return proc
# ...

关于python - 如何使用Python脚本启动和停止包含 "http.server.serveforever"的Python脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47138508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com