python -m SimpleHTTPServer
但是这个会让我出错:
socket.error: [Errno 48] Address already in use
我之前使用同样的命令为我的机器上另一个位置的不同网站开启了连接。
python -m SimpleHTTPServer
但是这个会让我出错:
socket.error: [Errno 48] Address already in use
我之前使用同样的命令为我的机器上另一个位置的不同网站开启了连接。
您已经有一个绑定在默认端口(8000)的进程。如果您之前已经运行过相同的模块,则很可能该进程仍然绑定在端口上。请先尝试找到其他进程:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
命令参数已经包括了,所以如果有多个python
进程在运行,你可以找到正在运行SimpleHTTPServer
的那个。你可能想要测试一下http://localhost:8000/
是否仍然显示本地文件的目录列表。
第二个数字是进程号;通过发送信号停止服务器:
kill 81651
这会发送一个标准的SIGTERM
信号;如果进程无响应,您可能需要采用更严厉的方法,例如发送一个SIGKILL
(kill -s KILL <pid>
或kill -9 <pid>
)信号。有关更多详细信息,请参见维基百科。
或者,通过在命令行上指定替代端口来在不同的端口上运行服务器:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
然后通过 http://localhost:8910
访问服务器;其中的 8910
可以是从1024开始的任何数字,只要该端口未被占用。
sudo kill -9 PID
命令。该命令可用于强制终止进程。请注意,执行此操作可能会导致数据丢失或其他不良影响,请谨慎使用。 - Danpekill
命令向进程发送一个信号,进程可以决定如何处理该信号(比如优雅地关闭或旋转日志文件)。这些信号是整数(每个信号都有一个名称),默认为15,意味着TERM
或终止。使用-9发送信号9,即KILL
,进程无法捕获和忽略该信号,操作系统将结束该进程,无论它是否愿意。 - Martijn Pieters简单解决方案:
8080
的进程:sudo lsof -i:8080
kill $PID
kill -9 $PID //to forcefully kill the port
PID是从步骤1的输出中获得的。
lsof
输出结果的例子,以及如何在输出中找到进程ID(即你所列出的“XXXX”),将会更好。对于任何没有这些信息的读者来说,在输出结果中,进程ID位于标题标签为"PID"下的第二个字段。 - lindes使用
sudo lsof -i:5000
这将给你一个正在使用该端口的进程列表。一旦得到进程列表,使用PID列上的ID终止进程的使用。 kill 379 #use the provided PID
在终端中键入以下命令即可轻松一行命令解决此问题:
ps -a
这将列出所有的进程,检查哪些是由Python使用的,并在终端中键入以下命令:
kill -9 (processID)
例如 kill -9 33178
您可以使用allow_reuse_address
来允许服务器重用地址。
服务器是否允许重用地址。默认为
False
,可以在子类中设置以更改策略。
import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()
SocketServer.TCPServer.allow_reuse_address = True
(来自 https://dev59.com/-GUp5IYBdhLWcg3wdXaa#15278302 )。更好的做法可能是继承TCPServer到一个新类并在那里设置该值。 - thomasa88您可以执行此类操作,服务于下一个可用的端口:
import SimpleHTTPServer
import SocketServer
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
port = 8000
while True:
try:
httpd = SocketServer.TCPServer(('', port), Handler)
print 'Serving on port', port
httpd.serve_forever()
except SocketServer.socket.error as exc:
if exc.args[0] != 48:
raise
print 'Port', port, 'already in use'
port += 1
else:
break
#!/usr/bin/env bash
MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}
(netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1
将其设置为可执行文件,命名为get-free-port
,然后您可以执行以下操作:
someprogram --port=$(get-free-port)
与本机Python方法相比,这并不是很可靠,因为bash脚本无法捕获端口 - 另一个进程可能会在您的进程之前抢占端口(竞争条件) - 但仍然可能在使用没有自己的重试方式的实用程序时非常有用。
我刚开始学习Python,但是在我的简短调查之后,我发现这是套接字绑定的典型情况。恰好此时套接字仍在使用中,您可能需要等待才能使用它。或者,您可以添加以下内容:
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
这应该可以在更短的时间内使端口变得可用。在我的情况下,它几乎立即使端口可用。
当我在调试或运行服务器时,完成后,我通常不会使用 终止 进程,而是使用 断开连接。
PyCharm 告诉我们,在服务器仍在运行时尝试关闭它时需要选择这两个选项。
这样做的结果是,进程仍在以该特定地址为背景运行,因此会出现 地址已在使用中
的错误。
pkill python
可以用。
如果你有多个运行着Python的服务器/应用程序(显然在不同端口),那么就要通过PORT
来获取该进程的PID
,然后再用kill
命令关闭它。
sudo lsof -i :5000 # here 5000 is the port number
| COMMAND | PID | USER | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME |
|---------|--------|----------|----|------|--------|----------|------|-------------------------|
| python | 185339 | username | 7u | IPv4 | 598745 | 0t0 | TCP | localhost:5000 (LISTEN) |
| python | 185348 | username | 7u | IPv4 | 598745 | 0t0 | TCP | localhost:5000 (LISTEN) |
| python | 185350 | username | 8u | IPv4 | 598745 | 0t0 | TCP | localhost:5000 (LISTEN) |
kill -9 185339 # here 185339 is the PID from above output; keep the -9 as it is
请查看@Andrew的答案,以避免将来出现此问题。
参考文献:kill命令,kill/pkill/killall,lsof
Namaste
如果以上解决方案都没有奏效:
获取您的进程正在侦听的端口:
$ ps ax | grep python
杀死该进程
$ kill PROCESS_NAME
python -m SimpleHTTPServer 8081
- BlenderTIME_WAIT
状态的情况下,可以参考linux - Python [Errno 98] Address already in use - Stack Overflow。此外,还可以查看unix - How to kill a process running on particular port in Linux? - Stack Overflow以获取更多终止运行在特定端口上的进程的方法。 - undefined