我试图从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 ...
任何建议都将不胜感激
答案 0 :(得分: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')
答案 1 :(得分:0)
尝试将参数作为数组传递给subprocess.call: subprocess.call([ “/ blscan / blscan.exe”, “test.ini”])
此外,根据您问题中的命令行与py输出,即使您的“工作目录”不同,也请仔细检查您的blscan.exe工具是否正常工作。也许你需要在blscan.exe所在的同一工作目录中。
os.chdir(“C:\ BLScan”)
答案 2 :(得分:0)
您很可能需要将路径传递给ini以及exe:
clst = [r'C:\blscan\blscan.exe', r'C:\blscan\test.ini']
p = Popen(clst, stdout=PIPE, stderr=PIPE)
# etc . . .
如果您通过Popen列表,它将为您正确引用args。