如何从 Python 执行程序?os.system 由于路径中的空格而失败[重复]
- 2025-01-07 08:44:00
- admin 原创
- 179
问题描述:
我有一个 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 参数,它都会失败并显示错误消息
文件名、目录名或卷标语法不正确。
解决方案 1:
subprocess.call
将避免处理各种 shell 的引用约定的问题。它接受列表,而不是字符串,因此参数更容易分隔。即
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
解决方案 2:
这是另一种不同的做法。
如果您使用的是 Windows,则以下操作类似于在资源管理器中双击文件,或将文件名作为 DOS“启动”命令的参数:使用与其扩展名关联的任何应用程序(如果有)打开该文件。
filepath = 'textfile.txt'
import os
os.startfile(filepath)
例子:
import os
os.startfile('textfile.txt')
如果记事本与 .txt 文件关联,这将使用记事本打开 textfile.txt。
解决方案 3:
最外层的引号由 Python 本身使用,而 Windows shell 看不到它。如上所述,Windows 只理解双引号。Python 会在 Windows 上将正斜杠转换为反斜杠,因此您可以使用
os.system('"C://Temp/a b c/Notepad.exe"')
' 被 Python 使用,然后将“C://Temp/abc/Notepad.exe”(作为 Windows 路径,不需要双反斜杠)传递给 CMD.EXE
解决方案 4:
至少在 Windows 7 和 Python 3.1 中,如果命令路径中有空格, os.system
Windows 要求命令行使用双引号。例如:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
一个让我困惑的真实示例是在 VirtualBox 中克隆驱动器。subprocess.call
由于某些访问权限问题,上述解决方案不起作用,但当我用双引号括住命令时,os.system
就变得开心了:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \n + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
解决方案 5:
对于 python >= 3.5subprocess.run
应该使用subprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
解决方案 6:
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
解决方案 7:
我怀疑这与在 Windows 中使用快捷方式时出现的问题相同...请尝试以下操作:
import os
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt")
解决方案 8:
对于 Python 3.7,请使用subprocess.call。使用原始字符串简化 Windows 路径:
import subprocess
subprocess.call([r'C:TempExampleNotepad.exe', 'C: est.txt'])
解决方案 9:
假设我们要运行你的 Django 网络服务器(在 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
解决方案 10:
不需要子流程,只需通过以下方式即可实现
GitPath="C:\\Program Files\\Git\\git-bash.exe"# Application File Path in mycase its GITBASH
os.startfile(GitPath)
扫码咨询,免费领取项目管理大礼包!