shell 来自子进程命令的实时输出状态错误:关闭文件Python上的I/o操作

tv6aics1  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(95)

我正在编写一个脚本,使用subprocess. Popen获取netstat状态。

cmd = 'netstat -nlpt | grep "java" | grep -v tcp6'

result1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True )
stdout, stderr=result1.communicate()

for line in iter(result1.stdout):
    print(line)

字符串
上面给出了ValueError:关闭文件上的I/O操作。。有没有办法得到直播输出。在live output from subprocess command中,他们使用writen和readlines在这里,我只需要打印实时状态,请有人帮助我解决这个问题。谢谢你,谢谢

v9tzhpje

v9tzhpje1#

你得到这个错误是因为stdout文件描述符在你想要迭代它的时候已经被关闭了。我写了一个工作版本。该实现可以实时地提供所调用的命令的输出。

验证码:

import sys
import subprocess

cmd = 'netstat -nlpt | grep "java" | grep -v tcp6'

result1 = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True
)

while True:
    out = result1.stdout.read(1)
    if out == "" and result1.poll() is not None:
        break
    if out != "":
        sys.stdout.write(out)
        sys.stdout.flush()

字符串

输出:

>>> python3 test.py
tcp        0      0 127.0.0.1:6943          0.0.0.0:*               LISTEN      239519/java         
tcp        0      0 127.0.0.1:63343         0.0.0.0:*               LISTEN      239519/java

相关问题