Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python执行程序?由于路径中存在空格,操作系统失败_Python_Shellexecute - Fatal编程技术网

如何从Python执行程序?由于路径中存在空格,操作系统失败

如何从Python执行程序?由于路径中存在空格,操作系统失败,python,shellexecute,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(); 然后它

我有一个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();
注意交换的单引号/双引号

无论此处是否有记事本参数,记事本都会失败并显示错误消息

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


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

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
将避免必须处理各种shell的引用约定的问题。它接受一个列表,而不是一个字符串,因此参数更容易分隔。i、 e

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')

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

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

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

Python使用“C://Temp/ab C/Notepad.exe”(作为Windows路径,不需要双反斜杠)传递给CMD.exe,至少在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\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

对于python>=3.5的
子进程,应使用run
代替
子进程调用


假设我们希望运行Django web服务器(在Linux中),并且您的路径(path=
'/home/'
)之间有空间,那么请执行以下操作:

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_)
导入子流程
args=['{}/manage.py'。格式('/home/'),'runserver']
res=subprocess.Popen(args,stdout=subprocess.PIPE)
输出,错误=res.communicate()
如果没有错误,请执行以下操作:
打印(输出)
其他:
打印(错误)

[注意]:

  • 不要忘记访问权限:
    chmod755-R
  • manage.py
    是例外:
    chmod+x manage.py
对于Python 3.7,请使用。使用原始字符串简化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)


很抱歉,这也不起作用,编辑的问题反映了这一点。我认为windows仅使用“,”而不是“引用”。如果您更改此选项,这可能会起作用。但是,如果您有嵌入的引号等,您仍然会遇到问题。我想这两个选项都用到了,但您可能是对的。我知道它可以工作(至少在shell中)带双引号。+1这是最好的一个,windows XP,2007 home edition运行良好在windows中使用原始字符串要简单得多:r“C:\Temp\a b C\Notepad.exe“是的,os.exec*函数将替换当前进程,因此python进程将无法继续。它们在unix上使用得更多,在unix中,shell启动命令的一般方法是在子命令中执行fork(),然后执行exec()。用于此操作的windows方法是os.spawn系列,可以改用它。子流程更具可移植性,并且在控制流程(捕获输入/输出等)方面提供了更大的灵活性,因此是首选。@PierreBdr:有一种情况下,rawstrings不起作用:您需要一个尾随斜杠。例如r'c:\foo\bar\'。实际上,使用前斜杠可能更好。对于python>=3.5
subprocess.call
应替换为
subprocess.run
是否有与*nix系统等效的函数?@Romeno:您可以尝试:
webbrowser.open(“textfile.txt”)
它应该打开一个文本编辑器。另请参见我的安装程序,textfile.txt需要加引号,例如:
os.startfile('path\to\textfile.txt')
,并且此方法似乎不需要加引号,例如win32api.WinExec('pythonw.exe d:\web2py\web2py.py-K welcome')在后台启动web2py计划程序。@rahul除了可执行文件的参数外,是否还需要加引号?所以,如果你想让记事本打开一个文件,或者是分开的?这似乎是像
os.system('curl URL>file')
这样的场景中最好的,我想看到curl的进度表刷新真正大的文件。如果反斜杠后面的第一个字母有特殊的含义(即
\t
\n
等等)那么这个特定的反斜杠必须加倍。作为Windows路径与此无关。请注意,如果在Windows上使用
os.system()
,cmd窗口将打开并保持打开状态,直到您关闭它启动的进程。我想最好使用
os.startfile()
。别忘了
import os
对我不起作用。如果你想运行带有参数的应用程序(us),请为将来的访问者使用
os.system(r'C:\temp\“ab C”\Notepad.exe')
os.system('C:\\temp\“ab C”\\Notepad.exe')
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)