【问题标题】:running windows command line program from python with ini file argument使用 ini 文件参数从 python 运行 Windows 命令行程序
【发布时间】:2013-05-03 23:02:01
【问题描述】:

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

任何建议将不胜感激

【问题讨论】:

    标签: python command ini


    【解决方案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')
    

    【讨论】:

    • 感谢您花时间解决问题和解决方案。现在工作正常:)
    【解决方案2】:

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

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

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

    【讨论】:

    • 此列表与此处无关。
    【解决方案3】:

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

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

    os.chdir("C:\BLScan")

    【讨论】:

    • 在 Windows 上,subprocess 通过组装可以传递给CreateProcess 的单个命令行字符串来工作,因此使用这样的参数列表确实没有任何优势(当然,除了,当你编写跨平台代码时)。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多