如何从Python中执行程序?操作系统。路径中存在空格导致系统失败

我有一个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();

注意交换的单/双引号。

无论这里是否有Notepad参数,它都会失败并显示错误消息

文件名、目录名或卷标签语法不正确。

778149 次浏览

我怀疑这和你在Windows中使用快捷方式是一样的问题……试试这个:

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

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

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

这是另一种方法。

如果你使用的是Windows,下面的操作就像在资源管理器中双击文件,或者将文件名作为DOS“start”命令的参数:文件被与其扩展名相关联的任何应用程序(如果有的话)打开。

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

例子:

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

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

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

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

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

至少在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)
import win32api # if active state python is installed or install pywin32 package seperately


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

对于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'])

假设我们想要运行你的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

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

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

不需要子流程,只需通过

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