我想以非阻塞方式读取外部程序的输出与我的 python 代码同时运行。为了启动程序(例如 netcat),我使用 subprocess.Popen 并将其 stdout 和 stderr 绑定到 subprocess.PIPE。然后我启动一个 multiprocessing.Process ,它的任务是检查该程序是否仍在运行(proc.poll() ),如果是,它会尝试从其管道中读取。我的问题是“proc.poll()”在“listen_to_fds”函数中总是返回 0,但在“call”函数(这是主函数)中运行良好,即 proc.poll() 返回 None(应用程序我启动永远不会完成,所以这是正确的返回值)。
我用以下函数调用: call ("./test.sh")
我的模块
def listen_to_fds(logger,proc):
while proc.poll() is None:
print("program still running", proc.returncode)
data = proc.stdout.read()
if data:
print("Data", data)
time.sleep(1)
print("last check", proc.returncode )
def call(cli ):
logger = logging.getLogger("isix.daemon")
cli_args = shlex.split(cli)
proc = subprocess.Popen(
cli_args
,stdout=subprocess.PIPE
,stderr=subprocess.PIPE
)
set_fd_as_nonblocking( proc.stdout )
set_fd_as_nonblocking( proc.stderr )
pipe2 = multiprocessing.Process(
target=listen_to_fds,
args=( logger, proc )
)
while proc.poll() is None:
print("program still running", proc.returncode)
data = proc.stdout.read()
if data:
print("Data", data)
time.sleep(1)