Subprocess.Call失败“系统无法找到指定的文件”

时间:2013-11-18 07:57:49

标签: python

我一直在研究这个问题一小时,这是令人愤怒的事情:

我有一个名为Manipula的.exe文件,它的源代码是.msu文件。我可以通过命令行成功运行我想要的东西,如:

"C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"

但是,我无法在Python中模拟这种行为 - 无论我使用什么。我试过了 os.systemsubprocess.call以及subprocess.Popen

如果我运行以下内容

p= subprocess.Popen("C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu", stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
 print line,
retval = p.wait()

我收到错误:The System Cannot Find the File Specified.我已经进行了三重检查,文件显然存在,因为它在我运行命令行时有效。

当我将shell=True添加到subprocess.Popen时,出现一个新的错误,表明没有目录C:/Flow,我认为因为shell很难处理空格...我只是没有'我知道发生了什么。

当我做os.system("C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu")时没有任何事情发生。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

将程序及其参数指定为list:

p = subprocess.Popen([
    "C:/Flow Check/Run Quick/Applications/Manipula.exe",
    "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"],
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

写字符串文字串行合并字符串:

>>> "abc" "xyz"
'abcxyz'

答案 1 :(得分:4)

你没有传两个字符串;您正在传递一个字符串,其间没有空格。 Python会自动连接相邻的字符串,但两者之间只有空格:

>>> "C:/Flow Check/Run Quick/Applications/Manipula.exe" "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"
'C:/Flow Check/Run Quick/Applications/Manipula.exeC:/Flow Check/Data Processing/BLAISE TO BLAISE.msu'

请注意.exeC:/Flow之间没有空格。

将两个字符串放在一个列表中:

p = subprocess.Popen(["C:/Flow Check/Run Quick/Applications/Manipula.exe", "C:/Flow Check/Data Processing/BLAISE TO BLAISE.msu"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

现在Popen()将处理将正确引用的字符串作为一个命令传递给底层操作系统。