0

我试图让一个 Popen 命令在带有 shell=False 的 Windows 上运行,而对于我的生活,我无法让它工作。iTMSTransporter 是一个命令行应用程序。这是我当前的代码:

import os
import shlex
import subprocess
from subprocess import Popen, PIPE, STDOUT

link = "C:/progra~1/itms/iTMSTransporter"
link1 = os.path.normpath(link)
link2 = "C:/Temp/test1.itmsp"
link3 = os.path.normpath(link2)
link4 = os.path.join(link3, "LogFile.txt")

command = link1 + " -m verify -f " + link3 +" -u username -p password -o " + link4 + " -s provider -v eXtreme"
process = Popen(shlex.split(command), shell=False, stdin=PIPE)

这给了我错误:

Traceback (most recent call last):
  File "C:\Temp\temp.py", line 13, in <module>
    process = Popen(shlex.split(command), shell=False, stdin=PIPE)
  File "C:\Python27\lib\subprocess.py", line 709, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 957, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

我确定 progra~1 不是问题,因为它适用于 shell=True,并且还尝试了 Program Files,结果相同。有什么想法可以在 Windows 平台 Python 2.7 上运行吗?

4

2 回答 2

0

经过大量研究,我发现了如何做到这一点,作为参考,我是这样做的:

import os
import subprocess
from subprocess import Popen, PIPE, STDOUT

link = "C:/progra~1/itms/iTMSTransporter.cmd"
link1 = os.path.normpath(link)
link2 = "C:/Temp/test1.itmsp"
link3 = os.path.normpath(link2)
link4 = os.path.join(link3, "LogFile.txt")

command = link1 + " -m verify -f " + link3 +" -u username -p password -o " + link4 + " -s provider -v eXtreme"
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
process = Popen(command, startupinfo=startupinfo, shell=False)

将 .cmd 添加到输入文件并删除 shlex 模块就可以了,再加上添加代码以停止打开命令窗口。

于 2014-05-27T15:55:20.090 回答
0

shlex.split不适用于 Windows 命令行(到目前为止),即使使用posix=0, 也不是必需的。有关更多详细信息,请参见python, windows : parsing command lines with shlex

shlex 类可以很容易地为类似于 Unix shell的简单语法编写词法分析器。

于 2016-03-09T19:08:08.250 回答