Python函数subprocess.check_output返回CalledProcessError:命令返回非零退出状态

1 投票
1 回答
520 浏览
提问于 2025-05-10 15:44

作为我之前问题的后续,我在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 

Apache Maven这个程序似乎无法运行。我猜可能是传给程序的参数有问题。我在argslogtoolDir这两个参数中没有发现任何拼写错误,但也许我漏掉了什么?有没有什么想法?

更新: mvn exec:exec没有运行,因为check_output似乎无法访问Windows的环境变量。我把path变量加到了processEnv中,现在在check_output的参数中用'mvn','--version'可以确认Maven是可以运行的。代码还是没法运行,但我想这可能是我定义目录的方式出了问题。

谢谢。

相关文章:

  • 暂无相关问题
暂无标签

1 个回答

0

问题解决了。简单来说:a) subprocess.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这个参数的方法,不过这可能不是问题,因为这只会用于数据分析。

谢谢。

撰写回答