Python subprocess.call和subprocess.Popen输出不同

4 投票
1 回答
6230 浏览
提问于 2025-04-16 22:51

当使用subprocess.call时,输出结果是我们预期的。

result = subprocess.call([securefx, '/NoPrompt', '/Q', '/RetryCount', retries, 
              '/RetryDelay', '1', '/Log', sfxLogFile, '/List', '/S', session])

打印结果会显示类似-533428或0这样的数字。

但是当我运行

args = [securefx, '/NoPrompt', '/Q', '/RetryCount', retries, '/RetryDelay', '1', 
       '/Log', sfxLogFile, '/List', '/S', session]
process = subprocess.Popen(args, stdout=subprocess.PIPE)
result = process.communicate()[0]

并打印结果时,我得到的是空白,或者stderr显示为"None"。

为什么会有这样的区别呢?我尝试使用Popen,即使call可以正常工作,原因是这个链接中的内容:Python subprocess.call在Windows 2003任务调度器中对sfxcl.exe不起作用 <- 我想试试看...

1 个回答

11

subprocess.Popen 会返回一个 Popen 对象,你可以用这个对象和正在运行的程序进行交流,还能获取它的输出。不过,subprocess.call 只会返回这个程序的返回码,也就是它执行完后给出的一个数字:

subprocess.call(*popenargs, **kwargs)
  Run command with arguments. Wait for command to complete, then return the returncode attribute.

所以说,subprocess.call 基本上等同于下面的代码,它的存在主要是为了方便使用:

def call(*popenargs, **kwargs):
    p = subprocess.Popen(*popenargs, **kwargs)
    return p.wait()

撰写回答