我在Python 3.6中使用以下方法创建了一个web服务器 http.server.HTTPServer
, http.server.SimpleHTTPRequestHandler
和 socketserver.ThreadingMixIn
. 它的工作原理和预期一样,我可以从本地网络的任何设备访问网页。
我将它编译为 PyInstaller
来创建一个Windows可执行文件。该网页在localhost下可以使用,但它不能从本地网络上的任何设备访问。
我使用了 nmap
从另一台设备上扫描托管Web服务器的计算机,发现Web服务器使用的端口(8080
)是打开的,当我正常运行我的脚本(使用Python解释器),一切都能正常工作。然而,当我使用由 PyInstaller
端口没有打开,网页无法访问。
可执行文件不会产生任何错误,除此之外,一切都正常。我试着以管理员身份运行.exe文件,并为此关闭了防病毒防火墙。但这并不奏效。
以下是我的 PyInstaller
命令。 pyinstaller --runtime-tmpdir "" --onefile -i icon.ico script.py
下面是我python文件中的相关代码。
import http.server
import socketserver
port = 8080
class ThreadingSimpleServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
pass #using this so the webserver can handle mutliple requests at a time
class myWebServer(http.server.SimpleHTTPRequestHandler):
def do_POST(self):
#does stuff
try:
server = ThreadingSimpleServer(('', port), myWebServer)
server.serve_forever()
except KeyboardInterrupt:
print('^C received, shutting down the program.')
server.socket.close()
我运行你的代码,它为我工作。O.S.要求打开连接,一切似乎都很正常。你必须提供某种形式的日志,以便让我们了解发生了什么问题。在我的运行中,我省略了-i开关,因为我没有.ico文件。
好吧,我解决了这个问题,但我还是不明白是什么原因造成的。从一开始,我就在AppData中的一个文件夹中构建我的脚本:它没有工作,我没有Windows防火墙警告确认显示。
我把我的脚本移到了桌面上,然后编译到这里:Windows防火墙确认显示出来了 (这个),可执行文件运行良好。
我想可能是防火墙早先标记了我的程序,所有后续的构建都被列入了黑名单或类似的东西,所以我试着在原来的位置编译脚本,但这次我重命名了它,并且我删除了所有之前生成的文件:它也没有工作(并且没有防火墙确认警告)。
所以现在我很确定这个错误是由防火墙引起的,它与编译的位置有关,但我真的不明白为什么。