Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ini文件参数从python运行windows命令行程序_Python_Command_Ini - Fatal编程技术网

使用ini文件参数从python运行windows命令行程序

使用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

我试图从一个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=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')