使用Python 2.7

问题描述:

可能的How to start a background process in Python?使用Python 2.7

不过了许多解决方案的重复实现使用os.system(CMD&)行为与子模块,只os.system(commandToRunInBackground &)看似简单,做的伎俩。 虽然根据Replacing os.system(),更推荐使用subprocess模块。 那么如何使用subprocess模块在shell中运行后台进程(注意,最后的&)。

+2

由于'subprocess.Popen'是非阻塞的,你为什么会想使用的背景是一个系统调用制成? –

+0

正如Zev所说 - 为什么你认为你需要这个,而不是你在后台运行的'subprocess.Popen()'-invoked命令的* default *行为? –

+1

'subprocess.Popen'没有与shell的'&'操作符等价,因为在子进程中没有选项可以调用'setpgid(0,0)'来创建一个在后台的新组。否则,如果进程通过stdin从终端读取数据,终端将不会通过SIGTTIN来终止它,因为它仍然处于前台进程组中。 – eryksun

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

在这个坚持到今天的shell上,也是因为在许多情况下让shell等待命令终止,然后允许来自用户的下一个输入,所以仍然存在没有&等待的情况为终止。

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

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

对你来说,只是使用Popen不叫wait() ;-)

+1

值得一提的是,subprocess.Popen默认不运行该shell。它接受一个列表:'[program,arg1,arg2]'(看一个例子,调用'shlex.split(cmd)') – jfs

+0

对。当OP考虑使用'&'时,他们可能也会期待其他东西的shell解释步骤。 – Alfe

+0

我同意你使用'Popen'的方式,但不同意顺序执行只是60年代不推荐使用的特性。 shell默认使用顺序执行,以允许同时输入许多命令(例如从一个文件),同时允许每个命令使用前一个命令产生的结果。 –