Python 波本对杀戮没有反应

Python 波本对杀戮没有反应,python,bash,raspberry-pi,Python,Bash,Raspberry Pi,环境:树莓皮喘息 我有一个python程序,它使用Popen调用另一个python程序 from subprocess import * oJob = Popen('sudo python mypgm.py',shell=True) 另一个菜单选项应该立即结束作业 oJob.kill() 但是作业仍在运行???您需要添加一个创建标志arg oJob = Popen('sudo python mypgm.py',shell=True, creationflags = subprocess.C

环境:树莓皮喘息

我有一个python程序,它使用Popen调用另一个python程序

from subprocess import *

oJob = Popen('sudo python mypgm.py',shell=True)
另一个菜单选项应该立即结束作业

oJob.kill()

但是作业仍在运行???

您需要添加一个创建标志arg

oJob = Popen('sudo python mypgm.py',shell=True, creationflags = subprocess.CREATE_NEW_PROCESS_GROUP)

subprocess.CREATE_NEW_PROCESS_GROUP Popen creationflags参数,用于指定将创建新进程组。此标志对于在子流程上使用os.kill()是必需的

编辑我同意关于如何导入内容以及为什么要获取内容的评论,但没有定义。另外,另一个答案似乎在正确的轨道上获得pid

import subprocess as sub

oJob = sub.Popen('sudo python mypgm.py', creationflags = sub.CREATE_NEW_PROCESS_GROUP)
oJob.kill()
警告:执行包含来自不受信任源的未初始化输入的shell命令会使程序易受shell注入攻击,这是一个严重的安全缺陷,可能导致任意命令执行。因此,在命令字符串由外部输入构成的情况下,强烈建议不要使用
shell=True


当您添加选项
shell=True
时,python将启动一个shell,shell将依次启动进程
python mymgm.py
。您在这里杀死的是shell进程,它不会杀死自己运行mymgm.py的子进程

为了确保子进程在
oJob.kill
上被终止,您需要将它们全部分组到一个进程组中,并使shell进程成为组长。 代码是

import os
import signal
import subprocess

# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before  exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 

os.killpg(pro.pid, signal.SIGTERM)  # Send the signal to all the process groups

当您向shell进程发送
SIGTERM
信号时,它也将杀死其所有子进程。

我使用的是“fromsubprocessimport*”,它表示subprocess not definedThen您已经将CREATE\u NEW\u process\u GROUP导入全局名称空间。但是,无论如何,您不应该使用子流程导入中的
*
。使用
导入子流程
或仅指定要导入的名称。例如,
从子流程导入Popen,创建新的流程组
@Rod Yes这应该对pi有效。这是内置的子流程模块。任何标准python版本都会有它。AttributeError“module”对象没有名为CREATE\u NEW\u PROCESS的属性_GROUP@Rod,
creationflags
是Windows的东西。除了其他人提出的(有效/正确的)观点,即
shell=True
是邪恶的之外,你不能杀死一个你不拥有的工作,而且
sudo
使作业归root所有,而不是您自己。如果在我的python pgm上执行chgmod+x,我会收到一条关于wiringPi需要sudo使用wiringpisetup的错误消息,您需要的
sudo
不会阻止它使您无法向如此提升的进程发送信号——因此,我真的不知道你上述评论的目的是什么。现在,您可以
sudo kill${pid}
,对于
oJob
的进程ID,这样您的kill也有升级权限,或者您可以在
sudo
下运行整个程序,这样就已经有了启动和kill的升级权限,从而避免再次需要使用
sudo
。可能是真的,也许不是。有些shell会自动执行调用它们的字符串中的最后一个命令。