【问题标题】:Calling cmd and passing arguments with Python subprocess使用 Python 子进程调用 cmd 并传递参数
【发布时间】:2015-07-08 04:26:23
【问题描述】:

我正在尝试让一个命令在 python 中运行,否则它可以作为 bat 文件或在 cmd 命令提示符中正常工作。

Python 版本 2.7.9。

以下在命令提示符下可以正常工作:

"C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\runreport.exe" -Report="NHC_chart_1Week_1Series" -TimeSeries="Precip Total.24hr@FK Intake Forecast" -Server="aqserver-van" -username="admin" -password="admin" -label="Battery Voltage Data" -OutputFile="C:\Aquarius\Reports\Altagas\Summary\24hr_Precip_Forecast.pdf"

这基本上调用了一个程序 (runreport.exe) 并向它传递了一堆参数。如果一切顺利,就会创建一个文件。

看来我应该可以在 python 中使用subprocess.call 做同样的事情 我尝试了许多不同版本的代码,但没有一个能正确运行程序。以下是我当前的代码:

import subprocess

run_report_program_path=r'C:\Program Files (x86)\Common Files\Aquatic Informatics\AQUARIUS\runreport.exe'
reportname="-Report=NHC_chart_1Week_1Series"
timeseries="-TimeSeries=Precip Total.24hr@FK Intake Forecast"
server="-Server=aqserver-van"
user="-username=admin"
passwrd="-password=admin"
output="-OutputFile=C:\Aquarius\Reports\Altagas\Summary\24hr_Precip_Forecast.pdf"
result=subprocess.check_output([run_report_program_path, reportname, timeseries, server, user, passwrd, output], shell= True)

程序 runreport 确实“弹出”但运行速度很快并且没有输出所需的结果,而是出现以下错误。有没有人看到这个问题?

Traceback (most recent call last):
  File "C:\aquarius\scripts\API_import_and_trigger_reports_py\python_scripts\call_run_reports\test2.py", line 10, in <module>
    result=subprocess.check_output([run_report_program_path, reportname, timeseries, server, user, passwrd, output], shell= True)
  File "C:\Python27\lib\subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
CalledProcessError: Command '['C:\\Program Files (x86)\\Common Files\\Aquatic Informatics\\AQUARIUS\\runreport.exe', '-Report=NHC_chart_1Week_1Series', '-TimeSeries=Precip Total.24hr@FK Intake Forecast', '-Server=aqserver-van', '-username=admin', '-password=admin', '-OutputFile=C:\\Aquarius\\Reports\\Altagas\\Summary\x14hr_Precip_Forecast.pdf']' returned non-zero exit status 1

此外,在命令提示符下,它通常会返回一组不错的错误(例如未找到时间序列,或成功创建报告),我也没有得到这些。是否可以在 python 会话中返回这些?

【问题讨论】:

  • 调试问题的一种方法是将命令行复制到变量中并使用 shlex.split(command_line) 拆分参数,然后将参数传递给子进程。
  • 命令行中的任何内容都不需要使用shell=True。不涉及 cmd.exe,这项工作会更简单、更安全。

标签: python windows cmd subprocess command-line-arguments


【解决方案1】:

subprocess.check_output 如果您的程序不返回零,则会引发异常。尝试在 output 字符串之前插入一个 r,这可能就是你的程序失败的原因。

它还将输出作为返回值传递,因此即使您的程序通过了,您也不会看到任何输出。

【讨论】:

    【解决方案2】:

    将输出更改为

    output=r'-OutputFile=C:\Aquarius\Reports\Altagas\Summary\24hr_Precip_Forecast.pdf'
    

    解决了这个问题。谢谢你

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多