【问题标题】:Python function subprocess.check_output returns CalledProcessError: command returns non-zero exit statusPython 函数 subprocess.check_output 返回 CalledProcessError:命令返回非零退出状态
【发布时间】:2015-11-19 15:53:06
【问题描述】:

作为我上一个问题的后续,这个问题很快得到解决,我正在 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,现在 'mvn','--version'check_output 参数中确认 Maven 运行。代码仍然没有运行,但我想这可能是我如何定义目录的问题。

干杯。

【问题讨论】:

  • IIRC,如果您使用shell=True,通常您将参数作为单个字符串传递。
  • (另外,不要出于任何原因使用shell=True。)
  • @Wooble -- 该声明可能是 bit 强:-)。有方便的时候。但是,任何使用它的代码都应该清楚地证明输入需要 100% 可信。
  • 有时候写不好的代码更方便,当然。这并不意味着你应该这样做。想必很多人也发现编写 SQL 可注入代码比参数化更方便。
  • @Wooble @mgilson 我用过shell = True,但这并没有解决这个问题。不幸的是,我不知道如何使用它,因为我需要一些环境变量(用于“mvn”命令)。该代码用于个人数据分析,因此安全性不是关键问题。关于问题本身,如果shell = True 强制使用单个参数字符串,我无法解决问题所在... :-/

标签: python maven


【解决方案1】:

问题解决了。基本上: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 参数的方法,这可能不会成为问题,因为它只会用于数据分析。

干杯。

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2021-01-11
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2019-08-12
    • 2019-11-28
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多