Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python socket.error:[Errno 48]地址已在使用中_Python_Macos_Simplehttpserver - Fatal编程技术网

Python socket.error:[Errno 48]地址已在使用中

Python socket.error:[Errno 48]地址已在使用中,python,macos,simplehttpserver,Python,Macos,Simplehttpserver,我正在尝试从mac终端用python设置服务器 我导航到文件夹位置并使用: python -m SimpleHTTPServer 但这给了我一个错误: socket.error: [Errno 48] Address already in use 我以前使用相同的命令打开过一个连接 对于位于我的计算机中不同位置的不同网站。您已将一个进程绑定到默认端口(8000)。如果您以前已经运行过相同的模块,则进程很可能仍然绑定到端口。首先尝试并定位其他进程: $ ps -fA | grep python

我正在尝试从mac终端用python设置服务器

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

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
kill-9
)信号。看

或者,通过在命令行上指定替代端口,在其他端口上运行服务器:

$ 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)
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)
这不如本机Python方法可靠,因为bash脚本没有捕获端口——另一个进程可以在进程捕获端口之前捕获端口(竞争条件)——但在使用没有自己的重试方法的实用程序时,仍然可能非常有用。

简单解决方案:

  • 使用端口
    8080
    查找进程:
  • 终止该端口上的进程:

  • PID是从步骤1的输出中获得的。

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

    (Mods:我确实试着把这个评论放在最好的答案上,但我没有足够的声誉。)

    使用

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

     kill 379 #use the provided PID
    

    我对Python还不熟悉,但经过简短的研究,我发现这是绑定套接字的典型情况。碰巧套接字仍在使用中,您可能需要等待使用它。或者,您可以添加:

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

    这将使端口在更短的时间内可用。在我的例子中,它几乎立即使端口可用

    以防上述解决方案无效:

  • 获取进程正在侦听的端口:

    $ps ax | grep python

  • 终止进程

    $kill进程名称


  • 我有一个raspberry pi,我正在使用PythonWeb服务器(使用Flask)。我已经尝试了以上所有方法,唯一的解决方案是关闭终端(外壳)并再次打开它。或者重新启动raspberry pi,因为没有任何东西可以阻止该Web服务器…

    简单的一行命令来摆脱它,在terminal中键入下面的命令

    ps -a
    
    kill -9 (processID) 
    
    这将列出Python正在使用的所有进程、签出,并在终端中键入bellow命令

    ps -a
    
    kill -9 (processID) 
    

    例如kill-9 33178

    您可以允许服务器将地址与一起重用

    服务器是否允许重新使用地址。这默认为
    False
    ,可以在子类中设置以更改策略


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

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

    用法:

    killport port_number
    
    例如:

    killport 8080
    
    从 刚刚遇到问题,要允许端口使用的重新绑定,需要对套接字服务器进行子类化,如下所示:

    someprogram --port=$(get-free-port)
    
    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或您正在使用的任何东西。

    Case with me 当我调试或运行服务器时会发生这种情况,当调试或运行完成时,我不会终止进程,而是断开它的连接

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

    这导致进程仍在该特定地址的后台运行,因此,
    地址已在使用中
    错误

    解决方案 对我有用

    另一种情况-多个进程
    如果有多个服务器/应用程序使用python运行(显然,在不同的端口杀死另一个进程,或者用不同的端口运行这个进程:
    python-m SimpleHTTPServer 8081
    我应该在浏览器中有什么url来查看它是否工作?我在不同的端口上运行,正如您所建议的,我可能需要使用
    sudo Kill-9 PID
    谢谢,@Danpe,我尝试了“sudo Kill PID”它不起作用,但“sudo kill-9 PID”终止了进程。有人知道-9指定了什么吗?甚至sudo手册似乎也没有涵盖这个参数@seokhoonlee:
    kill
    向进程发送一个信号,它可以决定处理这个信号(比如优雅地关闭或旋转日志文件)。这些信号是整数(每个都有一个名称),默认值为15,表示
    术语
    或终止。使用-9发送信号9,
    终止
    ,进程无法捕获和忽略该信号,操作系统将结束进程,不管它喜欢与否。@seokhoonley:另请参阅on W
    pkill python