如何从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");