Python Webserver 可执行文件不仅可以工作。 Pyinstaller 构建命令带有 --noconsole --onefile。
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
import json
hostName = "127.0.0.1"
serverPort = 8888
class MyServer(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/data':
info = "Response data..."
self.send_response(200)
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header("Access-Control-Allow-Methods", "*")
self.send_header("Access-Control-Expose-Headers", "x-my-custom")
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(bytes(info, 'utf-8'))
if __name__ == "__main__":
webServer = HTTPServer((hostName, serverPort), MyServer)
print("Server started http://%s:%s" % (hostName, serverPort))
try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
webServer.server_close()
print("Server stopped.")
我想在没有窗口控制台的 Windows 上运行我的可执行网络服务器。
解决方案是按照文档的建议重写 BaseHTTPRequestHandler 的 log_message 方法:
将任意消息记录到 sys.stderr。这通常会被覆盖以创建自定义错误日志记录机制。
原因在this剧作家问题中得到了很好的解释:
Pyinstaller 可用于以两种形式打包应用程序:
控制台应用程序。创建控制台窗口,输出可以写入 sys.stdout、sys.stderr
窗口化应用程序。没有创建控制台,只有一个 GUI 窗口。没有
或sys.stdout
。sys.stderr
如果创建了“窗口”应用程序,则 Playwright 中会出现异常,因为它尝试访问 stderr 但该应用程序不存在。
这个答案可能会迟到,但您也可以尝试更改/设置
sys.stdout
和sys.stderr
import io
stream = io.StringIO()
if (sys.stdout is None) or (sys.stderr is None):
sys.stdout, sys.stderr = stream, stream
它对我有用。