【问题标题】:Achieve os.system(cmd &) behaviour with subprocess module using python 2.7使用 python 2.7 使用子进程模块实现 os.system(cmd &) 行为
【发布时间】:2017-11-24 12:28:58
【问题描述】:

可能是How to start a background process in Python?的副本

但在许多解决方案中,只有os.system(commandToRunInBackground &) 似乎很简单并且可以解决问题。 不过,根据Replacing os.system(),更推荐使用subprocess 模块。 那么如何使用subprocess模块在shell方面运行后台进程(注意,最后是&)。

【问题讨论】:

  • 既然subprocess.Popen 是非阻塞的,你为什么要在后台使用它进行系统调用?
  • 正如 Zev 所说 - 为什么你认为你需要这个,而不是你的 subprocess.Popen()-invoked 命令在后台运行的 默认 行为?
  • subprocess.Popen 没有等效于 shell 的 & 运算符,因为没有选项可以在子进程中调用 setpgid(0, 0) 来创建一个位于后台的新组。否则,如果进程通过标准输入从终端读取,终端不会通过SIGTTIN 停止它,因为它仍在前台进程组中。
  • 使用os.system的原因是可以指定&的原始语法
  • 有一个间接的选择。将preexec_fn 参数设置为调用setpgid(0, 0) 的函数。然后你可以通过pid, status = os.waitpid(proc.pid, os.WUNTRACED);if os.WIFSTOPPED(status): sig = os.WSTOPSIG(status)检查它是否被终端停止。如果它被停止以防止从终端读取,这将是signal.SIGTTIN,或者如果停止以防止写入,则为signal.SIGTTOU。通常终端被配置为允许后台进程写入。

标签: python python-2.7 subprocess os.system


【解决方案1】:

在现代操作系统中,进程自然并行运行,其中一个等待另一个终止是一种特殊情况。当 & 语法在 60 年代后期设计时,情况就不同了。然后你必须标记一个并行执行。

在 shell 上这一直持续到今天,也是因为在许多情况下让 shell 在允许用户下一次输入之前等待命令终止是很方便的,所以仍然存在没有& 的情况等待终止。

在编程级别,&(并行执行)的情况是正常情况,不需要做任何事情来实现它。

没有&(等待终止)的情况可以通过显式使用wait()系统调用来实现(这是shell在大多数情况下所做的)。

对你来说,只需使用Popen 而不要调用wait() ;-)

【讨论】:

  • 值得一提的是subprocess.Popen默认不运行shell。它接受一个列表:[program, arg1, arg2](要查看示例,请致电 shlex.split(cmd)
  • 对。当 OP 考虑使用 & 时,他们可能期望其他东西也有一个 shell 解释步骤。
  • 我同意你只使用 Popen 的方式,但不同意顺序执行只是 60 年代不推荐使用的功能这一事实。默认情况下,shell 使用顺序执行来精确地允许同时输入许多命令(例如从文件中),同时允许每个命令使用前一个命令产生的结果。
  • 我不会将其称为 60 年代的“弃用功能”。但是早期的操作系统最初只知道顺序操作(但已经有了命令行),然后出现了并行执行的东西。要在命令行上实现这一点,必须添加一些东西(&)作为标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2011-09-12
  • 2012-03-15
  • 1970-01-01
  • 2014-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多