272

I'm trying to set up a server with python from mac terminal.

I navigate to folder location an use:

python -m SimpleHTTPServer

But this gives me error:

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

I had previously open a connection using the same command for a different website in a different location in my machine.

4

14 回答 14

423

您已经有一个绑定到默认端口 (8000) 的进程。如果您之前已经运行过相同的模块,则该进程很可能仍绑定到该端口。首先尝试找到另一个进程:

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

包含命令参数,因此SimpleHTTPServer如果有多个python进程处于活动状态,您可以发现其中一个正在运行。您可能想要测试是否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 及以上的任何数字,前提是该端口尚未被占用。

于 2013-09-28T20:54:37.300 回答
227

简单的解决方案:</p>

  1. 使用端口查找进程8080
sudo lsof -i:8080
  1. 终止该端口上的进程:
kill $PID

kill -9 $PID  //to forcefully kill the port

PID 来自步骤 1 的输出。

于 2016-09-18T11:28:51.470 回答
46

利用

 sudo lsof -i:5000

这将为您提供使用该端口的进程列表(如果有)。给出进程列表后,使用 PID 列上的 id 终止进程使用

 kill 379 #use the provided PID
于 2017-05-05T13:56:49.440 回答
26

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

ps -a

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

kill -9 (processID) 

例如杀死 -9 33178

于 2019-01-17T09:47:49.223 回答
21

顺便说一句,为了防止这种情况发生,只需在 SimpleHTTPServer 仍在正常运行时在终端中按Ctrl+即可。C这将“正确”停止服务器并释放端口,因此您不必在重新启动服务器之前再次查找并终止该进程。

(Mods:我确实尝试将此评论放在它所属的最佳答案上,但我没有足够的声誉。)

于 2016-10-14T11:56:51.330 回答
11

您可以允许服务器重用带有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()
于 2019-10-29T16:32:53.957 回答
8

您还可以在下一个最高可用端口上提供服务,在 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 脚本不会捕获端口——另一个进程可能会在你的进程捕获端口之前(竞争条件)——但在使用没有的实用程序时仍然可能足够有用没有自己的重试方法。

于 2015-09-21T14:31:06.493 回答
6

我是 Python 新手,但经过简短研究后,我发现这是绑定套接字的典型情况。碰巧套接字仍在使用中,您可能必须等待才能使用它。或者,您可以添加:

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

这应该使端口在更短的时间内可用。就我而言,它几乎立即使端口可用。

于 2018-03-26T04:01:20.093 回答
5

以防万一上述解决方案不起作用:

  1. 获取您的进程正在侦听的端口:

    $ ps斧头| grep 蟒蛇

  2. 杀死进程

    $ 杀死 PROCESS_NAME

于 2018-07-23T05:20:47.710 回答
3

我有一个树莓派,我正在使用 python Web 服务器(使用 Flask)。我已经尝试了上面的所有方法,唯一的解决方案是关闭终端(shell)并再次打开它。或者重新启动 raspberry pi,因为没有什么能阻止该网络服务器......

于 2018-07-26T09:21:43.350 回答
3

跟我一起做案子

这发生在我调试或运行服务器时,完成后,而不是Terminating进程,我Disconnect它。

当我们在服务器仍在运行时尝试关闭 PyCharm 时,PyCharm 会询问这两个选项

这导致该进程仍在该特定地址的后台运行,因此Address already in use出现错误。

解决方案

pkill python

为我工作。

另一个案例 - 多个进程

如果您有多个使用 python 运行的服务器/应用程序(显然,在不同的端口),那么使用获取该PID进程的PORTkill

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/killalllsof

合十礼

于 2021-04-26T12:55:54.113 回答
0

添加迈克尔施密德的答案 刚刚遇到问题,允许重新绑定端口使用需要像这样对套接字服务器进行SUBCLASS:

from socketserver import TCPServer, BaseRequestHandler
from typing import Tuple, Callable
class MySockServer(TCPServer):
    def __init__(self, server_address: Tuple[str, int], RequestHandlerClass: Callable[..., BaseRequestHandler]):
        self.allow_reuse_address = True
        super().__init__(server_address, RequestHandlerClass)

因为在实例化之后,更改该标志没有意义。然后使用它而不是 TCPServer 或您正在使用的任何东西。

于 2021-03-01T10:11:25.910 回答
0

对于任何开发人员来说,这都是常见的用例。

最好将其作为本地系统中的功能。(因此最好根据用户偏好将此脚本保存在 ksh/zsh 或 bash 配置文件等 shell 配置文件中)

function killport {
   kill -9 `lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'`
}

用法:

killport port_number

例子:

killport 8080
于 2021-02-19T18:41:36.507 回答
0

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

于 2022-01-08T12:47:41.433 回答