如何在Python中执行程序?os.system因路径中的空格而失败。
我有一个Python脚本,需要运行一个外部程序,但不知道为什么总是失败。
如果我用下面的脚本:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
它就会出现以下错误:
'C:\Temp\a' 不是内部或外部命令,也不是可运行的程序或批处理文件。
如果我用引号把程序包起来:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
这样就能正常工作了。但是,如果我加一个参数,它又不行了:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
那么,正确的方式是什么呢?我想执行一个程序并等待它完成。我不需要读取它的输出,因为它是一个可视化程序,完成工作后就会退出,但我需要等它结束。
另外,移动程序到没有空格的路径也不是一个选项。
这个方法也不行:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
注意这里单引号和双引号的位置调换了。
无论有没有传给记事本参数,它都会出现错误信息:
文件名、目录名或卷标语法不正确。
10 个回答
37
最外面的引号是被Python自己处理掉的,Windows的命令行看不到这些引号。正如上面提到的,Windows只理解双引号。
在Windows上,Python会把正斜杠(/)转换成反斜杠(\),所以你可以使用
os.system('"C://Temp/a b c/Notepad.exe"')
单引号(')也是被Python处理掉的,然后Python会把"C://Temp/a b c/Notepad.exe"(这是一个Windows路径,不需要双反斜杠)传给CMD.EXE。
91
这里有一种不同的方法。
如果你在使用Windows,下面的操作就像在资源管理器中双击文件,或者在命令行中用“start”命令打开文件:这个文件会用与它的扩展名关联的应用程序打开(如果有的话)。
filepath = 'textfile.txt'
import os
os.startfile(filepath)
举个例子:
import os
os.startfile('textfile.txt')
如果记事本和.txt文件关联在一起,这个操作会用记事本打开textfile.txt。
321
subprocess.call
这个功能可以帮助我们避免处理不同命令行环境中引号使用规则的问题。它接受一个列表,而不是一个字符串,这样参数之间的分隔就更简单了。也就是说:
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])