我自己创建和使用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, '')
如果您有任何想法,我将不胜感激。谢谢。
答案 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)