我试图简单地启动一个 HTTP 服务器,这样我就可以调用一个需要通过 HTTP 访问本地文件的子进程,但是使用以下代码运行服务器会阻止进一步的代码执行:
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
print('Hello, server!') # Never executed
从同一个脚本启动服务器、发出请求然后关闭服务器的最简单方法是什么?
看起来你正在使用文档中的代码,这很好! https://docs.python.org/3/library/http.server.html?highlight=simplehttprequesthandler#http.server.SimpleHTTPRequestHandler
{SimpleHTTPRequestHandler} 就是为了以这种方式工作。问题是
server_forever
永远不会回来。像这样的大多数进程都是为了从服务器关闭(通过 cronscript 或类似的或手动的)而不是外部请求。
您希望服务器处理多少个请求?您必须继承自 {SimpleHTTPRequestHandler} 并更改您不喜欢的行为,或者使用您想要的特定逻辑创建自己的处理程序。
我的意思的一个例子,用户来传输一个文件。那你的服务器应该关闭吗?如果他们想传输另一个文件怎么办?如果你没有那么多地使用它,你可以从一个保持它打开 5 分钟的脚本启动它,然后在没有活动传输或其他东西时终止进程。
如果你想要一些具有更复杂行为的东西,你将不得不编写一个更复杂的处理程序。
如果您可以添加更多信息,我会更新我的答案。
您可以使用
threading
和requests
来做到这一点。下面是一个 Python 脚本的小型工作示例,它启动一个 HTTP 服务器,然后在同一个程序中与它对话。它将使用对 test.txt
的请求显示 http://localhost:8000/test.txt
的内容。它等待一秒钟然后结束服务器。
import http.server
import socketserver
import threading
import requests
# create a test file
with open("test.txt", "w") as file:
file.write("hello!")
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
def run_server():
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
server_thread = threading.Thread(target=run_server)
# set daemon to true so that the thread exits when the main program is done
server_thread.daemon = True
server_thread.start()
print('Hello, server!')
response = requests.get('http://localhost:8000/test.txt')
if response.status_code == 200:
print("Content of 'test.txt':")
print(response.text)
else:
print(f"Error: {response.status_code}")
print('Goodbye, server!')
# Give the server a moment to finish processing any pending requests before the script exits
server_thread.join(timeout=1)
# Clean up test.txt
import os
os.remove("test.txt")