如果 pyinstaller 使用 --noconsole 标志构建可执行文件,Python Web 服务器无法在 Windows 上工作

问题描述 投票:0回答:2

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 上运行我的可执行网络服务器。

python-3.x windows webserver pyinstaller
2个回答
1
投票

解决方案是按照文档的建议重写 BaseHTTPRequestHandler 的 log_message 方法:

将任意消息记录到 sys.stderr。这通常会被覆盖以创建自定义错误日志记录机制。

原因在this剧作家问题中得到了很好的解释:

Pyinstaller 可用于以两种形式打包应用程序:

  1. 控制台应用程序。创建控制台窗口,输出可以写入 sys.stdout、sys.stderr

  2. 窗口化应用程序。没有创建控制台,只有一个 GUI 窗口。没有

    sys.stdout
    sys.stderr

如果创建了“窗口”应用程序,则 Playwright 中会出现异常,因为它尝试访问 stderr 但该应用程序不存在。


0
投票

这个答案可能会迟到,但您也可以尝试更改/设置

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

它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.