【问题标题】:Python subprocess.call/Popen/system issuePython subprocess.call/Popen/system 问题
【发布时间】:2014-09-06 14:39:34
【问题描述】:

我正在通过不同的方式启动子进程 - subprocess.call、Popen、os.system。

例如:

subprocess.call('wine application.exe', shell=True)

但是python启动了2个进程:

/bin/sh -c wine application.exe application.exe

当我通过在控制台窗口wine application.exe 中调用手动启动此应用程序时,我在ps ax 中只看到application.exe 实例。

正常吗? 我的猜测是没关系,因为它是子进程,它的父进程等待子进程完成。但是,为什么这种行为与我从控制台启动应用程序不同?在这种情况下,父母隐藏在哪里?

更新: 我经过深思熟虑,明白这确实是父进程。如果我将从 python 启动应用程序: subprocess.call('wine application.exe &', shell=True) 它将具有与 shell 中相同的行为(因为 shelltrue)。 所以在这种情况下,它将只有一个实例 - 您通过此子流程调用调用的实例。

但无论如何我仍然不明白为什么有 2 个进程而不是一个。 Invoker - 好的,但是第二个过程是从哪里来的?为什么它不适用于 1 个进程?

【问题讨论】:

    标签: python linux shell subprocess call


    【解决方案1】:

    当您使用 shell=True 启动应用程序时,python 会启动一个 shell,而 shell 会启动程序。这就是为什么你会看到两个程序。如果你像这样运行它

    subprocess.call(['wine', 'application.exe'])
    

    你只会看到一个。

    当你从命令行运行它时,你已经在 shell 中,所以你只看到了 1。

    更新

    当您运行subprocess.call('wine application.exe &', shell=True) 时,python 执行了一个执行 wine 的 shell。由于您添加了 &,shell 以 wine 为背景并退出。虽然这可能是你想要的,但潜在的缺点是 python 不会等待进程完成,当你的程序退出时会留下一个僵尸进程。

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多