我有以下帮助器方法,它在OSX上完美地执行命令,并且只在Windows上执行一些命令:
def exec_cmd(cmd):
"""Run a command and return the status, standard output and error."""
proc = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
# I like to get True or False rather than 0 (True) or 1 (False)
# which is just backwards as usually 0 is False and 1 is True
status = not bool(proc.returncode)
return (status, stdout, stderr)
例如,以下示例命令在Mac上使用我的exec_cmd
帮助程序完美地工作:
osascript -e 'tell application "Microsoft PowerPoint" to activate
osascript -e 'tell application "Microsoft PowerPoint" to quit
例如,以下示例命令在Windows上使用我的exec_cmd
帮助程序完美地工作:
"C:\Program Files\Microsoft Office\Office15\Powerpnt.exe" /S "C:\Users\MyUser\example.pptx"
Taskkill /IM POWERPNT.EXE /F
但是,以下内容在Windows上不起作用:
START "" "C:\Program Files\Microsoft Office\Office15\Powerpnt.exe"
它出错:
WindowsError: [Error 2] The system cannot find the file specified
即使这不起作用:
p = Popen(["START", "", "C:\Program Files\Microsoft Office\Office15\Powerpnt.exe"], stdout=PIPE, stderr=PIPE)
然而,在命令行上运行相同的命令可以正常工作,甚至是陌生人只是这样做:
os.system('START "" "C:\Program Files\Microsoft Office\Office15\Powerpnt.exe"')
为什么os.system工作,而不是Popen版本?这些只是简单的打开和关闭的应用程序示例,但我想做更多,因为我需要获取我计划运行的一些命令的stdout输出。
任何有关排序的帮助表示赞赏。我似乎无法理解os.system
与subprocess.Popen
的基本机制。
答案 0 :(得分:1)
您看到此问题是因为START
不是程序,而是shell命令。根据文档,os.system()
"在子shell"中执行命令(字符串),而popen
不在其中。 os.system()
有效地生成一个新的cmd.exe
实例,并将命令传递给该实例,而popen
只会生成一个新进程。
您收到The system cannot find the file specified
错误,因为没有名为START
的程序