读取管道时子流程无法正常工作

时间:2018-09-21 00:38:34

标签: python subprocess

我自己创建和使用QGIS工具插件。

最后,插件需要逻辑来确保用户已安装Java。

所以我尝试运行java -version并在输出时传递输出。

但是,未打印Java版本。

这是我的消息来源。

try:
    check_process = subprocess.Popen(["java", "-version", "2>&1"], stderr=subprocess.PIPE)
    check_process = check_process.communicate()

    # this is print func
    QgsMessageLog.logMessage(str(check_process), tag="Validating", level=QgsMessageLog.INFO)

except Exception as e:
    QgsMessageLog.logMessage(str(e), tag="Validating", level=QgsMessageLog.INFO)
    return

结果是

2018-09-21T09:36:21 0   (None, '')

如果您有任何想法,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

  

问题:子进程不起作用

您正在使用2>&1,这与 Shell命令相同,并且只有在使用shell=True后才能起作用。 您有权将stderr重定向到stdout,因为java -version将写入stderr
例如,执行以下操作:(注意差异,没有列表和stdout =!

check_process = subprocess.Popen("java -version 2>&1", shell=True, stdout=subprocess.PIPE)

由于这将为我获得预期的输出,因此您将使用以下命令获得(None, '')

check_process = subprocess.Popen(["java", "-version", "2>&1"], stderr=subprocess.PIPE)

第一个元组是stdout中未使用的Popen的输出。
第二个元组是stderr的输出,它是空字符串。

出于测试目的,请在QGIS内尝试:

result = subprocess.check_output(["echo", "Hello World!"])
print(result)