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

时间:2008-10-15 08:24:29

标签: python shellexecute

我有一个需要执行外部程序的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 个答案:

答案 0 :(得分:275)

subprocess.call将避免必须处理各种shell的引用约定的问题。它接受一个列表而不是字符串,因此参数更容易分隔。即。

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

答案 1 :(得分:62)

这是一种不同的做法。

如果您使用的是Windows,则可以在资源管理器中双击该文件,或者将文件名作为参数提供给DOS“start”命令:该文件随任何应用程序(如果有)打开与...相关联。

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

示例:

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

如果记事本与.txt文件相关联,这将使用记事本打开textfile.txt。

答案 2 :(得分:34)

最外面的引号由Python本身使用,而Windows shell则看不到它。如上所述,Windows只能理解双引号。 Python会在Windows上将forward-slashed转换为反斜杠,因此您可以使用

os.system('"C://Temp/a b c/Notepad.exe"')

'由Python使用,然后将“C:// Temp / a b c / Notepad.exe”(作为Windows路径,不需要双反斜杠)传递给CMD.EXE

答案 3 :(得分:18)

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

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

一个让我感到困惑的真实例子是在VirtualBox中克隆一个驱动器。由于某些访问权限问题,上面的subprocess.call解决方案无效,但当我双重引用该命令时,os.system变得很高兴:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

答案 4 :(得分:7)

import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

答案 5 :(得分:4)

我怀疑它与在Windows中使用快捷方式时的问题相同...试试这个:

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

答案 6 :(得分:3)

对于python> = 3.5 subprocess.run应该用来代替subprocess.call

https://docs.python.org/3/library/subprocess.html#older-high-level-api

import subprocess
subprocess.run(['notepad.exe', 'test.txt'])

答案 7 :(得分:0)

假设我们想要运行您的Django Web服务器(在Linux中),路径(path = '/home/<you>/<first-path-section> <second-path-section>')之间有空格,请执行以下操作:

import subprocess

args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)

[注意]:

  • 不要忘记访问权限:chmod 755 -R <'yor path'>
  • manage.py具有优势:chmod +x manage.py

答案 8 :(得分:0)

对于Python 3.7,请使用subprocess.call。使用原始字符串来简化Windows路径:

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

答案 9 :(得分:0)

无需子流程,只需完成以下操作即可

GitPath="C:\\Program Files\\Git\\git-bash.exe"# Application File Path in mycase its GITBASH
os.startfile(GitPath)