当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从Python执行程序?由于路径中的空格,os.system失败》经验,为你挑选了5个好方法。

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

注意交换的单/双引号.

在此处有或没有记事本参数,它会失败并显示错误消息

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

Brian.. 284

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

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

在Windows中使用原始字符串要简单得多:r"C:\ Temp\abc\Notepad.exe" (81认同)

@PierreBdr:有一种情况是rawstrings不起作用:你需要一个尾部斜杠.例如r'c:\ foo\bar \'.实际上,使用正斜杠可能更好.这些在整个Windows API中都被接受(虽然并不总是通过一些shell命令(例如复制)) (6认同)


user16738.. 64

这是一种不同的做法.

如果您正在使用Windows,则以下操作类似于在资源管理器中双击该文件,或将文件名作为参数提供给DOS"start"命令:文件将打开,其中任何应用程序(如果有)与其扩展名相关联.

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

例:

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

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



1> Brian..:

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

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


在Windows中使用原始字符串要简单得多:r"C:\ Temp\abc\Notepad.exe"
@PierreBdr:有一种情况是rawstrings不起作用:你需要一个尾部斜杠.例如r'c:\ foo\bar \'.实际上,使用正斜杠可能更好.这些在整个Windows API中都被接受(虽然并不总是通过一些shell命令(例如复制))

2> user16738..:

这是一种不同的做法.

如果您正在使用Windows,则以下操作类似于在资源管理器中双击该文件,或将文件名作为参数提供给DOS"start"命令:文件将打开,其中任何应用程序(如果有)与其扩展名相关联.

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

例:

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

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



3> 小智..:

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

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

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



4> Paul Hoffman..:

至少在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)



5> 小智..:
import win32api # if active state python is installed or install pywin32 package seperately

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有