在python中,是否有一种跨平台的方法来确定哪个进程正在侦听给定的端口?

在python中,是否有一种跨平台的方法来确定哪个进程正在侦听给定的端口?,python,tcp,cross-platform,pid,Python,Tcp,Cross Platform,Pid,在linux中,我可以在以下函数中使用lsof-I: def FindProcessUsingPort(portnum): import os fp = os.popen("lsof -i :%s" % portnum) lines = fp.readlines() fp.close() pid = None if len(lines) >= 2: pid = int(lines[1].split()[1]) retu

在linux中,我可以在以下函数中使用
lsof-I

def FindProcessUsingPort(portnum):
    import os
    fp = os.popen("lsof -i :%s" % portnum)
    lines = fp.readlines()
    fp.close()
    pid = None
    if len(lines) >= 2:
        pid = int(lines[1].split()[1])
    return pid
有没有跨平台的方法来解决这个问题

作为一个相关的参考,一旦我知道了流程id,这个库就非常好了,可以让我以跨平台的方式为它确定各种有用的流程信息。目前,我只是无法让第一部分跨平台工作(找到pid)


如果不熟悉
lsof-i
开关,则输出如下所示(在启动python进程打开侦听端口1234的TCP套接字后):

$lsof-i:1234 命令PID用户FD类型设备大小/关闭节点名称 python 22380 russ 15u IPv4 4015476 0t0 TCP*:1234(侦听)
这个答案更接近你的问题,但如果你能找到操作系统特有的方法,但没有严格的可移植性,我会让你的模块如下

def find_port_owner_windows(p):
    doit()

def find_port_owner_linux(p):
    doit2()

port_finders = {'nt': find_port_owner_windows,
                'posix': find_port_owner_linux}

try:
    find_port_owner = port_finders[os.name]
except KeyError:
    raise RuntimeError("No known port finder for your OS (%s)" % os.name)

不,这不是python内置的。

这并不能准确回答您提出的问题,但我认为您可能会发现它很有用,因为答案似乎是“您不能”

嗯,NT的
netstat.exe
可能没有那么强大,但它至少可以做到这一点:

C:\Documents and Settings\Sam\My Documents>netstat-o-b-n
活动连接
原型本地地址外部地址状态PID
TCP 127.0.0.1:1083 127.0.0.1:6000已建立3716
[Xming.exe]
TCP 127.0.0.1:1084 127.0.0.1:6000已建立3716
[Xming.exe]
TCP 127.0.0.1:1085 127.0.0.1:6000已建立3716
[Xming.exe]
TCP 127.0.0.1:1214 127.0.0.1:9481已建立236
无法获取所有权信息
TCP 127.0.0.1:1231 127.0.0.1:31416已建立2764
[boincmgr.exe]
TCP 127.0.0.1:3814 127.0.0.1:6000已建立716
[putty.exe]
“无法获取所有权信息”行是因为我不是以管理员的身份运行它,所以(就像在Linux上一样)我只能在自己的进程中看到这些信息。(实际上,对于ACL授予我必要访问权限的任何进程,我都可以这样做,但实际上,对于非管理员用户,这与“我的进程”的含义基本相同。)


从资源管理器的属性对话框复制的
netstat.exe
的确切版本是“5.1.2600.5512(xpsp.080413-0852)”。我碰巧运行的是XP SP3,但我不确定上次更新此文件的时间。(是的,我在XP中使用的是非管理员帐户。这并不像应该的那么简单,但也不像你想象的那么难。)

以下代码将帮助你检索在特定端口上运行的进程的PID。在这种情况下是5556

import subprocess
import re

port = 5556
data = subprocess.check_output(['lsof', '-i:{}'.format(port)]).decode().split('\n')[1]
pid = re.match('^([a-zA-Z0-9]+)(\s+)([0-9]+)\s', data).groups()[2]
print(pid)

请参阅:。他们谈论文件,但这不太可能对港口来说更容易。@tokland:谢谢。但我正在寻找一种不需要安装特定于操作系统的非python包的方法。我同意在windows上可能不太可能,但我仍然需要问一下+1用于链接到引用系统内部的内容。。。在Windows中,这些工具是必不可少的。当然是切线,但谢谢!我正在寻找一种跨平台的方法来实现这一点,解决方案最好不是“找出如何在每个平台上实现这一点,并根据os.name或sys.platform在代码中发出调用”。虽然如果这是所有可用的,那么它就是这样。但有时这确实是答案。比如在这个例子中。
import subprocess
import re

port = 5556
data = subprocess.check_output(['lsof', '-i:{}'.format(port)]).decode().split('\n')[1]
pid = re.match('^([a-zA-Z0-9]+)(\s+)([0-9]+)\s', data).groups()[2]
print(pid)