2013-05-03 122 views
0

我尝试从命令中运行带有ini配置文件的python脚本的Windows命令行应用程序,我怀疑它没有在执行时传递。使用ini文件参数从python运行windows命令行程序

该命令是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文件脚本IM。设备线是一个指示器,表明调音器没有从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 ... 

任何意见将理解

回答

1

当您从DOS shell中运行这个,你当前的工作目录是C:\BLscan,因为是从提示明显的告诉你:

C:\BLScan>blscan test.ini 

您也可以从错误输出告诉它肯定看在当前工作目录。 (一些Windows程序将,例如,尝试在同一目录作为可执行...但你无法在算,而这一次没有。)

Config name: .\test.ini 

因此,如果当前目录不是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') 
+0

感谢您花时间解决问题和解决方案。现在正常工作:) – satraver 2013-05-04 21:36:41

0

尝试传递参数给subprocess.call作为数组: subprocess.call([ “/ blscan/blscan.exe”, “test.ini”] )

此外,基于问题中的命令行与py的输出,请仔细检查blscan.exe工具是否工作,即使您的“工作目录”不同。也许你需要在blscan.exe所在的同一工作目录中。

os.chdir( “C:\ BLScan”)

+1

在Windows上,'subprocess'通过组装一个命令行字符串的工作原理,它可以传递给['CreateProcess'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx),所以使用这样的参数列表真的没有好处(除了当然,当你编写跨平台的代码时)。 – abarnert 2013-05-03 23:23:54

0

您最可能需要的路径传递到INI以及exe文件:如果您通过POPEN列表

clst = [r'C:\blscan\blscan.exe', r'C:\blscan\test.ini'] 
p = Popen(clst, stdout=PIPE, stderr=PIPE) 
# etc . . . 

,它会为你正确引用参数。

+0

该列表在这里不相关。 – abarnert 2013-05-03 23:24:18