使用 Python 子进程调用 cmd 并传递参数

Posted

技术标签:

【中文标题】使用 Python 子进程调用 cmd 并传递参数【英文标题】:Calling cmd and passing arguments with Python subprocess 【发布时间】: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,这项工作会更简单、更安全。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

将输出更改为

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

解决了这个问题。谢谢你

【讨论】:

以上是关于使用 Python 子进程调用 cmd 并传递参数的主要内容,如果未能解决你的问题,请参考以下文章

python调用完bat后,程序进入等待状态了

将参数从cmd传递到python脚本[重复]

Python:子进程并运行带有多个参数的bash脚本

如何在C语言中调用cmd命令?

在python中控制用于调用外部命令的子进程数

Java如何执行操作系统的CMD命令行