使用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中运行后台进程(注意,最后的&)。
答
在现代操作系统中,进程自然是并行运行,并且有一个等待终止另一个是特殊情况。当在60年代后期设计&
语法时,这是不同的。然后你必须标记并行执行。
在这个坚持到今天的shell上,也是因为在许多情况下让shell等待命令终止,然后允许来自用户的下一个输入,所以仍然存在没有&
等待的情况为终止。
在编程层面上,&
(并行执行)的情况是正常情况,不需要做任何事情来实现它。
通过显式使用wait()
系统调用可以实现没有&
(等待终止)的情况(这是大多数情况下shell的做法)。
对你来说,只是使用Popen
不叫wait()
;-)
由于'subprocess.Popen'是非阻塞的,你为什么会想使用的背景是一个系统调用制成? –
正如Zev所说 - 为什么你认为你需要这个,而不是你在后台运行的'subprocess.Popen()'-invoked命令的* default *行为? –
'subprocess.Popen'没有与shell的'&'操作符等价,因为在子进程中没有选项可以调用'setpgid(0,0)'来创建一个在后台的新组。否则,如果进程通过stdin从终端读取数据,终端将不会通过SIGTTIN来终止它,因为它仍然处于前台进程组中。 – eryksun