我正在尝试从另一个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 :(
答案 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
来终止进程而不是生成另一个命令。