gpt4 book ai didi

python bottle在WINDOWS上可以在同一个地址和端口上运行两个程序

转载 作者:可可西里 更新时间:2023-11-01 14:18:47 24 4
gpt4 key购买 nike

我刚刚在 Windows 上遇到了一个关于 Bottle 的奇怪问题。当我测试我的 Bottle 代码时,我发现它可以在 WINDOWS 上使用相同的地址和端口运行多个相同的程序。但是当你试图在 Linux 或 Mac 上使用相同的地址和端口启动多个相同的程序时,它会报告以下错误:

socket.error: [Errno 48] Address already in use 

我的 Bottle 代码是:

from bottle import route, run, template

@route('/hello/:name')
def index(name='World'):
return template('<b>Hello {{name}} </b>', name=name)

run(host='localhost', port=9999)

然后从bottle到wsgiref开始追代码,最后发现问题可能在Python27\Lib\BaseHTTPServer.py。我的意思是当我使用下面的简单代码时:

import BaseHTTPServer

def run(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
server_address = ('localhost', 9999)
print "start server on localhost 9999"
httpd = server_class(server_address, handler_class)
httpd.serve_forever()

run()

同样的问题也会发生在 Windows 上。

但是如果我直接使用socketserver,比如下面的代码:

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):

def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())

if __name__ == "__main__":
HOST, PORT = "localhost", 9999
print "Start a server on localhost:9999"
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)

# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()

同样的问题不会发生,我的意思是即使在窗口上,当您尝试启动另一个程序时,上面的 socketserver 代码也会报告错误。

socket.error: [Errno 48] Address already in use

我所有的测试都使用 Python 2.7、Windows 7 和 Centos 5。

所以我的问题是为什么 HTTPServer 在 windows 上会有这个问题?我怎样才能让我的 Bottle 程序在 windows 上报告相同的错误,就像在 windows 上一样?

最佳答案

不好意思打扰大家

我找到了解决办法,就是这么简单。只需将 BaseHTTPServer.HTTPServer 的属性 allow_reuse_address 更改为 0。

代码应该是:

from bottle import route, run, template
import BaseHTTPServer

@route('/hello/:name')
def index(name='World'):
return template('<b>Hello {{name}} </b>', name=name)

setattr(BaseHTTPServer.HTTPServer,'allow_reuse_address',0)
run(host='localhost', port=9999)

关于python bottle在WINDOWS上可以在同一个地址和端口上运行两个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17044939/

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