2024-04-26 22:44:15 发布
网友
我试图终止一个进程(特别是iChat)。在命令行中,我使用以下命令:
ps -A | grep iChat
然后:
kill -9 PID
但是,我不确定如何将这些命令转换为Python。
假设您在一个类Unix的平台上(因此ps -A存在)
ps -A
>>> import subprocess, signal >>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) >>> out, err = p.communicate()
在out变量(字符串)中为您提供ps -A的输出。你可以把它分成几行,然后在上面循环…:
out
>>> for line in out.splitlines(): ... if 'iChat' in line: ... pid = int(line.split(None, 1)[0]) ... os.kill(pid, signal.SIGKILL) ...
(您可以避免导入signal,并使用9,而不是signal.SIGKILL,但我不太喜欢这种样式,所以我宁愿这样使用命名常量)。
signal
9
signal.SIGKILL
当然,您可以在这些行上执行更复杂的处理,但这模拟了您在shell中所做的操作。
如果您所追求的是避免ps,那么在不同的类Unix系统中很难做到这一点(ps在某种意义上是获取进程列表的通用API)。但是,如果您只考虑一个特定的类Unix系统(不需要任何跨平台的可移植性),那么它可能是可能的;特别是在Linux上,/proc伪文件系统非常有用。但你需要澄清你的具体要求,然后我们才能在这后一部分提供帮助。
ps
/proc
如果为了跨平台而必须考虑Windows情况,请尝试以下操作:
os.system('taskkill /f /im exampleProcess.exe')
psutil可以按名称查找进程并终止它:
import psutil PROCNAME = "python.exe" for proc in psutil.process_iter(): # check whether the process name matches if proc.name() == PROCNAME: proc.kill()
假设您在一个类Unix的平台上(因此
ps -A
存在)在
out
变量(字符串)中为您提供ps -A
的输出。你可以把它分成几行,然后在上面循环…:(您可以避免导入
signal
,并使用9
,而不是signal.SIGKILL
,但我不太喜欢这种样式,所以我宁愿这样使用命名常量)。当然,您可以在这些行上执行更复杂的处理,但这模拟了您在shell中所做的操作。
如果您所追求的是避免
ps
,那么在不同的类Unix系统中很难做到这一点(ps
在某种意义上是获取进程列表的通用API)。但是,如果您只考虑一个特定的类Unix系统(不需要任何跨平台的可移植性),那么它可能是可能的;特别是在Linux上,/proc
伪文件系统非常有用。但你需要澄清你的具体要求,然后我们才能在这后一部分提供帮助。如果为了跨平台而必须考虑Windows情况,请尝试以下操作:
psutil可以按名称查找进程并终止它:
相关问题 更多 >
编程相关推荐