【问题标题】:Open an application with a script file loaded with '/s' in subprocess在子进程中打开一个使用“/s”加载的脚本文件的应用程序
【发布时间】:2015-02-20 09:13:36
【问题描述】:

要在 Windows 中打开一个名为 DriveMaster 的应用程序,我使用的是 subprocess.Popen:

subprocess.Popen(['C:\\Program Files (x86)\\ULINK DM2012 PRO NET\\v970\\DriveMaster.exe'])

现在,如果我需要在加载了脚本文件的情况下打开 DriveMaster,我应该怎么做?从 windows 命令提示符或我运行的 windows 批处理文件:

"C:\Program Files (x86)\ULINK DM2012 PRO NET\v970\DriveMaster.exe" /s:c:\Program Files (x86)\ULINK DM2012 PRO NET\v970\Scripts\ATA\SATA_TestBatch.srt

现在我需要使用脚本文件 SATA_TestBatch.srt 文件打开 DriveMaster。请注意,加载脚本文件的命令中包含“/s:”。

【问题讨论】:

标签: python windows python-2.7 python-3.x subprocess


【解决方案1】:

您可以尝试的第一件事是按原样运行命令:

import subprocess

subprocess.check_call(r'"C:\Program Files (x86)\ULINK DM2012 PRO NET\v970\DriveMaster.exe" /s:c:\Program Files (x86)\ULINK DM2012 PRO NET\v970\Scripts\ATA\SATA_TestBatch.srt')

【讨论】:

  • 但这涉及到并且确实需要 shell,在这里很容易避免。
  • @tripleee:错误。 Popen 默认情况下使用 shell。
  • 请注意在可执行文件路径周围使用双引号。没有它们CreateProcess 从左到右扫描lpCommandLine 以查找可执行文件的路径。例如,如果没有引号,它会尝试C:\ProgramC:\Program Files (x86)C:\Program Files (x86)\ULINKC:\Program Files (x86)\ULINK DM2012C:\Program Files (x86)\ULINK DM2012 PRO,最后是C:\Program Files (x86)\ULINK DM2012 PRO NET\v970\DriveMaster.exe。如果后者不存在,它还会在继续之前尝试附加 .EXE 扩展名。
【解决方案2】:

这应该可行:

subprocess.Popen([r'C:\\Program Files (x86)\\ULINK DM2012 PRO NET\\v970\\DriveMaster.exe', r'/s:c:\Program Files (x86)\ULINK DM2012 PRO NET\v970\Scripts\ATA\SATA_TestBatch.srt'])

参考:https://docs.python.org/3/library/subprocess.html

args 应该是一系列程序参数或单个字符串。默认情况下,如果 args 是一个序列,则要执行的程序是 args 中的第一项。

【讨论】:

  • 它导致SyntaxError。对 Windows 路径使用原始字符串文字:r'...\U..'
  • 出现错误,你是对的。它实际上是一个 FileNotFoundError。我的错,我很少使用 Windows :) 。答案已编辑,谢谢塞巴斯蒂安。使用适用于 Windows 的 Python3.4 进行测试:subprocess.Popen(['C:\test.bat', '--my-test-arg']。 Test.bat 包含echo %1%,它打印--my-test-arg
  • 没有。如果路径中包含'\U',则会引发 SyntaxError
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多