Python函数subprocess.check_输出返回被调用的进程错误:命令返回非零退出状态

Python函数subprocess.check_输出返回被调用的进程错误:命令返回非零退出状态,python,maven,Python,Maven,作为我上一个问题的后续,这个问题很快就解决了,我正在WinPython中运行下面的Python代码: import os, subprocess os.chdir("C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/") logtoolDir="C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/producti

作为我上一个问题的后续,这个问题很快就解决了,我正在WinPython中运行下面的Python代码:

import os, subprocess
os.chdir("C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/")
logtoolDir="C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/ "
#processEnv = {'JAVA_HOME': 'C:/Program Files/Java/jdk1.8.0_66/'}
args = r'"org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput.data"'
subprocess.check_output(['mvn', 'exec:exec', '-Dexec.args=' + args],
                             shell = True, cwd = logtoolDir)
并获取以下错误:

CalledProcessError: Command '['mvn', 'exec:exec', '-Dexec.args="org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput.data"']' returned non-zero exit status 1 
ApacheMaven可执行文件似乎没有运行。我的猜测是,参数被错误地传递给了程序。我在args或logtoolDir参数中找不到任何拼写错误,但可能我遗漏了什么?有什么想法吗

更新: mvn exec:exec未运行,因为
检查\u输出
无法访问Windows的环境变量。我将path变量添加到
processEnv
中,现在在
check\u output
args确认Maven运行中添加了
'mvn','--version'
。代码仍然没有运行,但我想这可能是我如何定义目录的问题


干杯。

问题解决了。基本上是:a)
子进程。check_output
无法读取Windows的环境变量(例如PATH、JAVA_HOME),因此我必须重新定义我在
processEnv
中使用的变量,并将其传递到函数的参数中。此外,b)args变量的定义不正确。我需要删除一组引号,并使用
r
使其成为原始

更正后的代码:

logtoolDir='C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/'
processEnv = {'JAVA_HOME': 'C:/Program Files/Java/jdk1.8.0_66/jre/',
          'Path' : 'C:/Program Files/apache-maven-3.3.3/bin/'}
args = r"org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput2.data"
print(subprocess.check_output(['mvn', 'exec:exec', '-Dexec.args='+ args],
                           shell = True, env = processEnv, cwd = logtoolDir))
不幸的是,我找不到使用
shell=True
参数的方法,这可能不会成为问题,因为它只用于数据分析


干杯。

问题解决了。基本上是:a)
子进程。check_output
无法读取Windows的环境变量(例如PATH、JAVA_HOME),因此我必须重新定义我在
processEnv
中使用的变量,并将其传递到函数的参数中。此外,b)args变量的定义不正确。我需要删除一组引号,并使用
r
使其成为原始

更正后的代码:

logtoolDir='C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/'
processEnv = {'JAVA_HOME': 'C:/Program Files/Java/jdk1.8.0_66/jre/',
          'Path' : 'C:/Program Files/apache-maven-3.3.3/bin/'}
args = r"org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput2.data"
print(subprocess.check_output(['mvn', 'exec:exec', '-Dexec.args='+ args],
                           shell = True, env = processEnv, cwd = logtoolDir))
不幸的是,我找不到使用
shell=True
参数的方法,这可能不会成为问题,因为它只用于数据分析


干杯。

IIRC,如果您使用
shell=True
,通常您会将参数作为单个字符串传递。(此外,千万不要出于任何原因使用
shell=True
。@Wooble——这句话可能有点强:-)。有时它很方便。然而,任何使用它的代码都应该清楚地记录输入必须是100%可信的。当然,有时候写坏代码更方便。这并不意味着你应该这么做。大概很多人也觉得编写SQL注入代码比参数化更方便。@Wooble@mgilson我使用了
shell=True
,但这并没有解决这个问题。不幸的是,我不知道如何使用它,因为我需要一些环境变量(用于“mvn”命令)。该代码用于个人数据分析,因此安全性不是关键问题。关于问题本身,如果
shell=True
强制使用单个参数字符串,我就无法理解问题所在-/IIRC,如果您使用
shell=True
,通常您会将参数作为单个字符串传递。(另外,千万不要出于任何原因使用
shell=True
。@Wooble——这条语句可能有点强:-)。有时它很方便。然而,任何使用它的代码都应该清楚地记录输入必须是100%可信的。当然,有时候写坏代码更方便。这并不意味着你应该这么做。大概很多人也觉得编写SQL注入代码比参数化更方便。@Wooble@mgilson我使用了
shell=True
,但这并没有解决这个问题。不幸的是,我不知道如何使用它,因为我需要一些环境变量(用于“mvn”命令)。该代码用于个人数据分析,因此安全性不是关键问题。关于问题本身,如果
shell=True
强制使用单个参数字符串,我就无法理解问题所在-/