295

我有一个需要执行外部程序的 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();

注意交换的单/双引号。

这里有或没有记事本的参数,它会失败并显示错误消息

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

4

10 回答 10

308

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

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
于 2008-10-15T08:37:39.200 回答
81

这是一种不同的方法。

如果您使用的是 Windows,则以下操作类似于在资源管理器中双击文件,或将文件名作为 DOS“启动”命令的参数:文件使用与其扩展名关联的任何应用程序(如果有)打开.

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

例子:

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

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

于 2008-10-15T20:09:37.587 回答
35

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

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

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

于 2009-05-26T18:13:51.810 回答
20

至少在 Windows 7 和 Python 3.1中,如果命令的路径中有空格,os.systemWindows 希望命令行被双引号引起来。例如:

  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)
于 2009-10-26T01:33:47.333 回答
11

对于 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'])
于 2018-01-22T13:16:24.057 回答
10
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
于 2010-04-30T07:08:44.977 回答
3

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

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
于 2008-10-15T08:27:05.633 回答
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
于 2018-01-22T13:29:24.267 回答
0

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

import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])
于 2019-08-07T16:55:33.170 回答
0

不需要子流程,可以简单的实现

GitPath="C:\\Program Files\\Git\\git-bash.exe"# Application File Path in mycase its GITBASH
os.startfile(GitPath)
于 2020-04-26T04:32:59.230 回答