如何从python执行程序? 由于path中的空格,os.system失败

我有一个python脚本需要执行一个外部程序,但由于某种原因失败。

如果我有以下脚本:

import os; os.system("C:\\Temp\\abc\\Notepad.exe"); raw_input(); 

然后失败,出现以下错误:

 'C:\Temp\a' is not recognized as an internal or external command, operable program or batch file. 

如果我用引号逃避这个程序:

 import os; os.system('"C:\\Temp\\abc\\Notepad.exe"'); raw_input(); 

然后它工作。 但是,如果我添加一个参数,它会停止工作:

 import os; os.system('"C:\\Temp\\abc\\Notepad.exe" "C:\\test.txt"'); raw_input(); 

执行程序并等待它完成的正确方法是什么? 我不需要从它读取输出,因为它是一个可视化程序,可以完成一项工作然后退出,但是我需要等待它完成。

另外请注意,将程序移动到非间隔path也不是一个选项。


编辑这不工作:

 import os; os.system("'C:\\Temp\\abc\\Notepad.exe'"); raw_input(); 

请注意交换的单/双引号。

有或没有参数在这里记事,它失败,错误信息

 The filename, directory name, or volume label syntax is incorrect. 

subprocess.call将避免不得不处理各种shell的引用约定的问题。 它接受一个列表,而不是一个string,所以参数更容易分隔。 即

 import subprocess subprocess.call(['C:\\Temp\\abc\\Notepad.exe', 'C:\\test.txt']) 

这是一个不同的方式。

如果你正在使用windows,下面的行为就像在资源pipe理器中双击文件,或者把文件名作为DOS“start”命令的一个参数:文件被打开,任何应用程序(如果有的话)的扩展都是关联的。

 filepath = 'textfile.txt' import os os.startfile(filepath) 

例:

 import os os.startfile('textfile.txt') 

如果记事本与.txt文件关联,这将打开带有记事本的textfile.txt文件。

最外层的引号是由Python本身消耗的,而Windowsshell没有看到它。 如上所述,Windows只能理解双引号。 Python会在Windows上正向转换为反斜杠,所以你可以使用

 os.system('"C://Temp/abc/Notepad.exe"') 

该'是由Python使用,然后通过“C://Temp/abc/Notepad.exe”(作为一个Windowspath,不需要双反斜杠)到CMD.EXE

至less在Windows 7和Python 3.1中,如果命令的path中有空格,则Windows中的os.system 双引号的命令行。 例如:

  TheCommand = '\"\"C:\\Temp\\abc\\Notepad.exe\"\"' os.system(TheCommand) 

一个真实世界的例子就是在VirtualBox中克隆一个驱动器。 上面的subprocess.call解决scheme由于某些访问权限问题而不起作用,但是当我双引号的时候, os.system变得很开心:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \ + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"' os.system(TheCommand) 
 import win32api # if active state python is installed or install pywin32 package seperately try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly except: pass 

我怀疑这是当你在Windows中使用快捷方式相同的问题…试试这个:

 import os; os.system("\"C:\\Temp\\abc\\Notepad.exe\" C:\\test.txt");