我试图从mac终端设置一个python服务器。

我导航到文件夹位置使用:

python -m SimpleHTTPServer

但这给了我错误:

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

我以前使用相同的命令打开了一个连接 在我的电脑里的不同位置的一个不同的网站。


当前回答

简单的一行命令来摆脱它,在终端输入下面的命令,

ps -a

这将列出Python正在使用的所有进程,并在终端中键入下面的命令,

kill -9 (processID) 

例如kill -9 33178

其他回答

我有一个树莓派,我使用python web服务器(使用Flask)。我已经尝试了上面的所有方法,唯一的解决方案是关闭终端(shell)并再次打开它。或者重新启动树莓派,因为没有什么可以停止web服务器……

返回此错误是因为试图在项目仍在运行时重新运行该项目。停止并重新启动项目。

您可以使用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()

您已经有一个绑定到默认端口(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及以上的任何数字,前提是端口尚未被占用。

你也可以服务于下一个最高的可用端口,在Python中这样做:

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

如果你需要为其他实用程序做同样的事情,作为bash脚本可能更方便:

#!/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脚本不会捕获端口——另一个进程可能会在您的进程之前捕获端口(竞态条件)——但在使用没有自己的重试方法的实用程序时,仍然可能足够有用。