【发布时间】: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