如何确定通过os.system启动的进程的PID

我想用程序启动几个foo.py ,即模块foo.py启动foo.py几个实例。

由于我有时不得不手动终止进程,我需要进程id来执行kill命令。

即使整个设置是相当“脏”,是否有一个良好的pythonic方式来获得进程的pid ,如果进程是通过os.system启动?

foo.py:

 import os import time os.system("python bar.py \"{0}\ &".format(str(argument))) time.sleep(3) pid = ??? os.system("kill -9 {0}".format(pid)) 

bar.py:

 import time print("bla") time.sleep(10) % within this time, the process should be killed print("blubb") 

Solutions Collecting From Web of "如何确定通过os.system启动的进程的PID"

os.system返回退出代码。 它不提供子进程的PID。

使用subprocess模块。

 import subprocess import time argument = '...' proc = subprocess.Popen(['python', 'bar.py', argument], shell=True) time.sleep(3) # <-- There's no time.wait, but time.sleep. pid = proc.pid # <--- access `pid` attribute to get the pid of the child process. 

要终止进程,可以使用terminate方法或kill 。 (不需要使用外部kill程序)

 proc.terminate() 

你可以使用os.forkpty()来代替,它作为结果代码给你伪终端的pid和fd。 更多文档在这里: http : //docs.python.org/2/library/os.html#os.forkpty

分享我的解决方案,以防止他人帮助他人:

我从这个页面的信息在后台运行一个fortran exe文件。 我试图用os.forkpty来获得它的pid,但它没有给我的过程的PID。 我不能使用子进程,因为我没有发现它将如何让我在后台运行我的进程。

在一位同事的帮助下,我发现:

 exec_cmd = 'nohup ./FPEXE & echo $! > /tmp/pid' os.system(exec_cmd) 

如果想要将pid附加到同一个文件,请使用双箭头。