子流程.Popen()导致在Linux中通信()需要很长时间



我正在进行一个项目,试图扫描通过TCP端口587通信的任何应用程序。在windows中,我可以使用以下代码:

import subprocess
from datetime import datetime
proc = subprocess.Popen('netstat -ano -p tcp | findStr "587"', shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
print(f'before proc.communicate(): {datetime.now()}')
out, err = proc.communicate()
print(f'after: {datetime.now()})

结果如下:

before proc.communicate(): 2022-03-12 17:21:04.079038
after: 2022-03-12 17:21:12.411754

然而,当我尝试在Linux中运行以下替代命令时:

import subprocess
from datetime import datetime
proc = subprocess.Popen('lsof -nP -iTCP:587',
shell=True,
stdout=subprocess.PIPE)
print(f'before proc.communicate(): {datetime.now()}')
# this line is taking way too long to run
(out, err) = proc.communicate()
print(f'after: {datetime.now()}')

我的结果如下:

before proc.communicate(): 2022-03-12 14:31:23.652261
after: 2022-03-12 14:31:36.613435

我不确定使用日期时间是否能给出最准确的结果。。。当我从IDE(PyCharm(在Linux中运行该命令时;之后"结果,而在Windows上它是即时的。非常感谢任何帮助解决这个问题或更好地了解正在发生的事情!谢谢

试试psutil。这可能会解决速度慢的问题,并提供python对象而不是原始文本。

import psutil
psutil.net_connections(kind='tcp')

只需使用netstat,让Python来进行文本过滤。

我手边没有Linux盒子;这是FreeBSD 13上的输出。

In [1]: import subprocess as sp
In [2]: %timeit sp.run(["netstat", "-an", "-p", "tcp"], capture_output=True, text=True)
3.04 ms ± 20 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [3]: r = sp.run(["netstat", "-an", "-p", "tcp"], capture_output=True, text=True);
In [4]: %timeit [ln for ln in r.stdout.splitlines() if ".587 " in ln]
6.81 µs ± 7.74 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [5]: port587 = [ln for ln in r.stdout.splitlines() if ".587 " in ln]
Out[5]: []

请注意,运行外部进程需要几毫秒,但过滤输出只需要几微秒。

最新更新