Python函数subprocess.check_输出返回被调用的进程错误:命令返回非零退出状态
作为我上一个问题的后续,这个问题很快就解决了,我正在WinPython中运行下面的Python代码: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
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
强制使用单个参数字符串,我就无法理解问题所在-/