📜  subprocess.popen 没有输出 - Python (1)

📅  最后修改于: 2023-12-03 15:20:22.611000             🧑  作者: Mango

使用 subprocess.popen 没有输出

在 Python 中,可以使用 subprocess.Popen 命令来启动外部进程,并在 Python 程序中使用外部程序的输出或输入。

然而,有时候使用 subprocess.Popen 启动的程序却没有输出,即无法从它的标准输出或标准错误流中获取到任何内容。

以下是几种可能导致该问题的原因和解决方法:

原因一:缓冲区没有刷新

默认情况下,subprocess.Popen 将启动外部进程,并将其标准输出和标准错误流连接到一个缓冲区中。但是,有些程序可能会在执行期间只在缓冲区中输出少量数据,或者根本不刷新缓冲区。

这种情况下,应该使用 subprocess.Popen 命令的 stdoutstderr 参数来实时获取输出和错误,而不是等待程序结束后再获取:

import subprocess

cmd = ['your_program', 'arg1', 'arg2']
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

for line in process.stdout:
    print(line)

for line in process.stderr:
    print(line)

注意,这里使用了 stdout=subprocess.PIPEstderr=subprocess.PIPE 参数,将输出和错误连接到一个管道中,然后使用 process.stdoutprocess.stderr 来实时获取输出和错误信息。

原因二:程序没有输出

如果你确信程序应该有输出(即使仅是一些状态消息),但却没有获取到任何内容,那么很可能是程序没有输出。

在这种情况下,应该确保程序的逻辑正确,并在需要时手动在程序中添加输出语句,以确保其运行时可以输出一些内容。

原因三:程序执行异常导致退出

如果程序在执行期间出现错误并异常退出,那么它的输出和错误可能不会被捕获,因为它们在程序崩溃前还没有被刷新到缓冲区或输出流中。

在这种情况下,应该使用 subprocess.Popen 命令的 check_returncode() 方法来确保程序顺利退出,并捕获任何异常:

import subprocess

cmd = ['your_program', 'arg1', 'arg2']
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

process.wait()

if process.returncode != 0:
    raise subprocess.CalledProcessError(process.returncode, cmd)

for line in process.stdout:
    print(line)

for line in process.stderr:
    print(line)

这里使用了 process.wait() 来等待程序执行完成,使用 process.returncode 来获取程序的退出状态。如果程序的退出状态不为0(即非正常退出),则使用 subprocess.CalledProcessError 抛出异常。

结论

使用 subprocess.Popen 命令启动外部进程时,如果没有输出,可能是缓冲区没有刷新、程序没有输出或程序执行异常导致退出等原因导致的。要解决这些问题,应该使用正确的参数、手动添加输出语句、捕获异常并等待程序顺利退出等。