使用ini文件参数从python运行windows命令行程序
我试图从一个python脚本运行一个windows命令行应用程序,命令中有一个ini配置文件,我怀疑它在执行时没有传递 命令为c:\BLScan\BLScan.exe test.ini ini文件是应用程序需要知道扫描哪些参数的配置文件 这是我使用的脚本使用ini文件参数从python运行windows命令行程序,python,command,ini,Python,Command,Ini,我试图从一个python脚本运行一个windows命令行应用程序,命令中有一个ini配置文件,我怀疑它在执行时没有传递 命令为c:\BLScan\BLScan.exe test.ini ini文件是应用程序需要知道扫描哪些参数的配置文件 这是我使用的脚本 import subprocess from subprocess import Popen, PIPE cmd = '/blscan/blscan test.ini' p = Popen(cmd , stdout=PIPE, stderr
import subprocess
from subprocess import Popen, PIPE
cmd = '/blscan/blscan test.ini'
p = Popen(cmd , stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
print "Return code: ", p.returncode
print out.rstrip(), err.rstrip()
当我使用subprocess.popen调用应用程序时,它看起来并没有读取ini文件。设备行是一个指示器,表明调谐器尚未从ini文件中识别,因此程序将下降到默认调谐器
Return code: 0
BLScan ver.1.1.0.1091-commited
Config name: .\test.ini
Device 0: TBS 6925 DVBS/S2 Tuner
Device number: Total Scan Time = 0.000s
Transponders not found !
>>>
这是从dos shell运行时的外观
C:\BLScan>blscan test.ini
BLScan ver.1.1.0.1091-commited
Config name: .\test.ini
Scan interval 0
From 3400 to 3430 Mhz, Step 5 Mhz, Horizontal, Minimal SR 1000 KS, Maximal SR 10
0000 KS
3400 Mhz ...
3405 Mhz ...
3410 Mhz ...
任何建议都将不胜感激尝试将参数作为数组传递给子流程。调用: 子进程调用([“/blscan/blscan.exe”,“test.ini”]) 此外,根据问题中的命令行与py输出,再次检查blscan.exe工具是否工作,即使“工作目录”不同。可能您需要位于blscan.exe所在的同一工作目录中
os.chdir(“C:\BLScan”)您很可能需要将路径传递到ini和exe:
clst = [r'C:\blscan\blscan.exe', r'C:\blscan\test.ini']
p = Popen(clst, stdout=PIPE, stderr=PIPE)
# etc . . .
如果您向Popen传递一个列表,它将为您正确地引用参数。当您从DOS shell运行此命令时,您当前的工作目录是
C:\BLscan
,从您显示的提示中可以明显看出:
C:\BLScan>blscan test.ini
您还可以从错误输出中判断它确实在当前工作目录中查找。(例如,某些Windows程序将尝试与可执行文件相同的目录……但您不能指望它,而这一个也不能。)
因此,如果您当前的目录不是C:\BLScan
,它也无法从DOS shell中工作。试试这个:
C:\BLScan>cd \
C:\>\BLScan\blscan test.ini
您将得到与Python中完全相同的错误
如果不能依赖于C:\BLScan,则必须传递一个绝对路径。例如,这将再次起作用:
C:\>\BLScan\blscan \BLScan\test.ini
Python与这里的shell没有什么不同。如果给它一个相对路径,如test.ini
,它将使用当前工作目录。因此,您有两个相同的选择:
os.chdir('/blscan')
p = subprocess.popen('blscan test.ini')
…或:
p = subprocess.popen(r'\BLScan\blscan \BLScan\test.ini')
在Windows上,
subprocess
通过组合一个可以传递给它的命令行字符串来工作,因此使用这样的参数列表实际上没有任何好处(当然,在编写跨平台代码时除外)。该列表与此无关。感谢您花时间运行此问题和解决方案。现在一切正常:)
p = subprocess.popen(r'\BLScan\blscan \BLScan\test.ini')