Python subprocess.call和subprocess.Popen给我不同的输出

4
使用 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]

当我使用call()函数运行代码并打印结果时,我得到的是空白或者错误信息为“None”。

为什么会有这样的区别呢?虽然call()函数可以正常工作,但我尝试使用Popen()函数的原因是因为这个问题:Python subprocess.call on sfxcl.exe not working from Windows 2003 Task Scheduler。我想试一试是否能够用Popen()函数解决这个问题...

1个回答

11

subprocess.Popen返回一个Popen对象,你可以使用它来与进程通信并获取输出。但是subprocess.call只会返回进程的返回代码:

subprocess.call(*popenargs, **kwargs)
  运行带有参数的命令。等待命令完成,然后返回returncode属性。

所以subprocess.call基本上等同于以下代码,并且仅出于方便而存在:

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

我找到了!process.wait()将会给我相同的返回码。 :) - kouri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接