python - subprocess.Popen()。pid返回父脚本

时间:2015-06-25 01:57:51

标签: python subprocess

我正在尝试从另一个Python脚本运行Python脚本,并获取其pid,以便我可以在以后将其删除。

我尝试subprocess.Popen()使用父脚本的参数shell=True', but the pid attribute returns the pid`,所以当我尝试杀死子进程时,它会杀死父进程。

这是我的代码:

proc = subprocess.Popen(" python ./script.py", shell=True)
pid_ = proc.pid
.
.
.
# later in my code

os.system('kill -9 %s'%pid_)

#IT KILLS THE PARENT :(

2 个答案:

答案 0 :(得分:10)

shell=True启动一个新的shell进程。 proc.pid是该shell进程的pid。 kill -9杀死shell进程,使孙子python进程成为一个孤儿。

如果孙子python脚本可以生成自己的子进程,并且想要终止整个进程树,那么请参阅How to terminate a python subprocess launched with shell=True

#!/usr/bin/env python
import os
import signal
import subprocess

proc = subprocess.Popen("python script.py", shell=True, preexec_fn=os.setsid) 
# ...
os.killpg(proc.pid, signal.SIGTERM)

如果script.py没有产生任何进程,请使用@icktoofay suggestion:drop shell=True,使用list参数,然后调用proc.terminate()proc.kill() - 后者总是最终起作用:

#!/usr/bin/env python
import subprocess

proc = subprocess.Popen(["python", "script.py"]) 
# ...
proc.terminate()

如果要从其他目录运行父脚本;您可能需要get_script_dir() function

考虑使用其对象(可能通过multiprocessing)导入python模块并运行其函数,而不是将其作为脚本运行。这是code example that demonstrates get_script_dir() and multiprocessing usage

答案 1 :(得分:1)

所以直接在没有shell的情况下运行它:

<body>
   <form>
      <select id="Jantina" name="Jantina">
         <option value='0'>Sila Pilih</option>
         <option value='1'>Lelaki</option>
         <option value='2'>Perempuan</option>
      </select>
      <br>
      <select id="etnik" name="etnik">
         <option value='0'>Sila Pilih</option>
         <option value='1'>Melayu</option>
         <option value='2'>India</option>
      </select>
      <br>
      <select id="warganegara" name="warganegara">
         <option value='0'>Sila Pilih</option>
         <option value='1'>Yes</option>
         <option value='2'>Tidak</option>
      </select>
      <input name="Simpan" type="submit" value="Simpan" onClick="Validate()" onclick="Validate1()" onclick="Validate2()">
   </form>
</body>

顺便说一句,您可能需要考虑将硬编码proc = subprocess.Popen(['python', './script.py']) 更改为sys.executable。此外,您可以使用proc.kill()来终止进程而不是提取PID并使用它;此外,即使您确实需要通过PID终止,也可以使用os.kill来终止进程而不是生成另一个命令。