0

我试图从 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 ...

任何意见,将不胜感激

4

3 回答 3

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')
于 2013-05-03T23:29:17.177 回答
0

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

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

os.chdir("C:\BLScan")

于 2013-05-03T23:04:40.640 回答
0

您很可能需要将路径传递给 ini 以及 exe:

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

如果您向 Popen 传递一个列表,它会为您正确引用 args。

于 2013-05-03T23:08:17.100 回答