使用 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 并传递参数的主要内容,如果未能解决你的问题,请参考以下文章