Python:子进程跨平台运行的麻烦

时间:2016-05-12 16:24:04

标签: python windows macos python-2.7

我有以下帮助器方法,它在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.systemsubprocess.Popen的基本机制。

1 个答案:

答案 0 :(得分:1)

您看到此问题是因为START不是程序,而是shell命令。根据文档,os.system()"在子shell"中执行命令(字符串),而popen不在其中。 os.system()有效地生成一个新的cmd.exe实例,并将命令传递给该实例,而popen只会生成一个新进程。

您收到The system cannot find the file specified错误,因为没有名为START的程序