📅  最后修改于: 2023-12-03 15:20:22.611000             🧑  作者: Mango
在 Python 中,可以使用 subprocess.Popen
命令来启动外部进程,并在 Python 程序中使用外部程序的输出或输入。
然而,有时候使用 subprocess.Popen
启动的程序却没有输出,即无法从它的标准输出或标准错误流中获取到任何内容。
以下是几种可能导致该问题的原因和解决方法:
默认情况下,subprocess.Popen
将启动外部进程,并将其标准输出和标准错误流连接到一个缓冲区中。但是,有些程序可能会在执行期间只在缓冲区中输出少量数据,或者根本不刷新缓冲区。
这种情况下,应该使用 subprocess.Popen
命令的 stdout
和 stderr
参数来实时获取输出和错误,而不是等待程序结束后再获取:
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.PIPE
和 stderr=subprocess.PIPE
参数,将输出和错误连接到一个管道中,然后使用 process.stdout
和 process.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
命令启动外部进程时,如果没有输出,可能是缓冲区没有刷新、程序没有输出或程序执行异常导致退出等原因导致的。要解决这些问题,应该使用正确的参数、手动添加输出语句、捕获异常并等待程序顺利退出等。