如何通过Python查找进程的pid?

如何通过Python查找进程的pid?,python,pid,Python,Pid,朋友们: 我正在Linux中运行一个脚本: 我可以使用ps命令获取进程 ps -ef | grep "python test09.py&" 但是,通过给定关键字pythontest09.py&使用python代码,我如何知道运行脚本的pid EDIT-01 我的意思是,我想使用python脚本查找正在运行的脚本python test09.py&的pid EDIT-02 当我运行anali的方法时,会出现以下错误: Traceback (most recent c

朋友们:

我正在Linux中运行一个脚本:

我可以使用
ps
命令获取进程

ps -ef | grep "python test09.py&"
但是,通过给定关键字
pythontest09.py&
使用python代码,我如何知道运行脚本的pid


EDIT-01

我的意思是,我想使用python脚本查找正在运行的脚本
python test09.py&
的pid


EDIT-02

当我运行anali的方法时,会出现以下错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 363, in catch_zombie
    yield
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 429, in cmdline
    return cext.proc_cmdline(self.pid)
ProcessLookupError: [Errno 3] No such process (originated from sysctl)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test11.py", line 29, in <module>
    print(get_pids_by_script_name('test09.py'))
  File "test11.py", line 15, in get_pids_by_script_name
    cmdline = proc.cmdline()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/__init__.py", line 694, in cmdline
    return self._proc.cmdline()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 342, in wrapper
    return fun(self, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 429, in cmdline
    return cext.proc_cmdline(self.pid)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/psutil/_psosx.py", line 376, in catch_zombie
    raise AccessDenied(proc.pid, proc._name)
psutil.AccessDenied: psutil.AccessDenied (pid=1)

回溯(最近一次呼叫最后一次):
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第363行,在catch_zombie中
产量
cmdline中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第429行
返回cext.proc\u cmdline(self.pid)
ProcessLookupError:[Errno 3]没有这样的进程(源于sysctl)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“test11.py”,第29行,在
打印(通过脚本名称(“test09.py”)获取PID)
文件“test11.py”,第15行,按脚本名获取PID
cmdline=proc.cmdline()
cmdline中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_init__.py”,第694行
返回self.\u proc.cmdline()
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第342行,在包装器中
返回乐趣(自我、*args、**kwargs)
cmdline中的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”,第429行
返回cext.proc\u cmdline(self.pid)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py”,第77行,在退出时__
self.gen.throw(类型、值、回溯)
catch_zombie中第376行的文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/psutil/_psosx.py”
提升访问被拒绝(proc.pid,proc.\u name)
psutil.AccessDenied:psutil.AccessDenied(pid=1)

使用此代码并与cmd行进行字符串匹配

import psutil
# Iterate over all running process
for proc in psutil.process_iter():
    try:
        # Get process name & pid & cmd line from process object.
        processName = proc.name()
        processID = proc.pid
        print(proc.cmdline())
        print(processName , ' ::: ', processID)
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
        pass

使用此代码并对cmd行执行字符串匹配

import psutil
# Iterate over all running process
for proc in psutil.process_iter():
    try:
        # Get process name & pid & cmd line from process object.
        processName = proc.name()
        processID = proc.pid
        print(proc.cmdline())
        print(processName , ' ::: ', processID)
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
        pass

如果只需要当前脚本的pid,请使用
os.getpid

import os
pid = os.getpid()
但是,下面是使用
psutil
查找运行命名python脚本的python进程的PID的示例。这可能包括当前进程,但主要用例用于检查其他进程,因为对于当前进程,只需使用上面所示的
os.getpid
就更容易了

sleep.py

#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil


def get_pids_by_script_name(script_name):

    pids = []
    for proc in psutil.process_iter():

        try:
            cmdline = proc.cmdline()
            pid = proc.pid
        except psutil.NoSuchProcess:
            continue

        if (len(cmdline) >= 2
            and 'python' in cmdline[0]
            and os.path.basename(cmdline[1]) == script_name):

            pids.append(pid)

    return pids


print(get_pids_by_script_name('sleep.py'))
get_pids.py

#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil


def get_pids_by_script_name(script_name):

    pids = []
    for proc in psutil.process_iter():

        try:
            cmdline = proc.cmdline()
            pid = proc.pid
        except psutil.NoSuchProcess:
            continue

        if (len(cmdline) >= 2
            and 'python' in cmdline[0]
            and os.path.basename(cmdline[1]) == script_name):

            pids.append(pid)

    return pids


print(get_pids_by_script_name('sleep.py'))
运行它:

$ chmod +x sleep.py

$ cp sleep.py other.py

$ ./sleep.py &
[3] 24936

$ ./sleep.py &
[4] 24937

$ ./other.py &
[5] 24938

$ python get_pids.py 
[24936, 24937]

如果只需要当前脚本的pid,请使用
os.getpid

import os
pid = os.getpid()
但是,下面是使用
psutil
查找运行命名python脚本的python进程的PID的示例。这可能包括当前进程,但主要用例用于检查其他进程,因为对于当前进程,只需使用上面所示的
os.getpid
就更容易了

sleep.py

#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil


def get_pids_by_script_name(script_name):

    pids = []
    for proc in psutil.process_iter():

        try:
            cmdline = proc.cmdline()
            pid = proc.pid
        except psutil.NoSuchProcess:
            continue

        if (len(cmdline) >= 2
            and 'python' in cmdline[0]
            and os.path.basename(cmdline[1]) == script_name):

            pids.append(pid)

    return pids


print(get_pids_by_script_name('sleep.py'))
get_pids.py

#!/usr/bin/env python
import time
time.sleep(100)
import os
import psutil


def get_pids_by_script_name(script_name):

    pids = []
    for proc in psutil.process_iter():

        try:
            cmdline = proc.cmdline()
            pid = proc.pid
        except psutil.NoSuchProcess:
            continue

        if (len(cmdline) >= 2
            and 'python' in cmdline[0]
            and os.path.basename(cmdline[1]) == script_name):

            pids.append(pid)

    return pids


print(get_pids_by_script_name('sleep.py'))
运行它:

$ chmod +x sleep.py

$ cp sleep.py other.py

$ ./sleep.py &
[3] 24936

$ ./sleep.py &
[4] 24937

$ ./other.py &
[5] 24938

$ python get_pids.py 
[24936, 24937]
使用子流程库 导入子流程 script_name=“test09.py” ps_out=subprocess.Popen(“ps-ef.split(“”),stdout=subprocess.PIPE,stderr=subprocess.PIPE)。stdout.read()。decode('UTF-8')。split(\n”)#启动命令行并收集输出 对于输入ps#输出:#在返回的ps行上循环 如果项目中有脚本名称: script_pid=entry.split()[1]#检索行中的第二个条目 打破 打印(脚本和pid) 使用子流程库 导入子流程 script_name=“test09.py” ps_out=subprocess.Popen(“ps-ef.split(“”),stdout=subprocess.PIPE,stderr=subprocess.PIPE)。stdout.read()。decode('UTF-8')。split(\n”)#启动命令行并收集输出 对于输入ps#输出:#在返回的ps行上循环 如果项目中有脚本名称: script_pid=entry.split()[1]#检索行中的第二个条目 打破 打印(脚本和pid)
请你澄清一下你在这里想做什么。您是在试图找出同一个python进程内的pid(只需使用
os.getpid()
),还是在试图根据另一个python进程的命令行找出其pid?如果是第二个选项,那么它始终是您的进程之一,还是由另一个用户运行的进程?我想找到运行脚本的pid。例如我可以使用
ps-ef | grep xxx
请你澄清一下你在这里想做什么。您是在试图找出同一个python进程内的pid(只需使用
os.getpid()
),还是在试图根据另一个python进程的命令行找出其pid?如果是第二个选项,那么它始终是您的进程之一,还是由另一个用户运行的进程?我想找到运行脚本的pid。比如我可以用你的方式工作。但是应该除了更多:
[psutil.NoSuchProcess,psutil.AccessDenied,]
@244boy我不相信捕获
psutil.AccessDenied
是必要的。它只尝试读取全球可读的
/proc//cmdline
。例如,如果试图提取受保护的环境变量(取决于对
/proc//environ
的访问),则情况就不同了。一般来说,我不喜欢捕获有理由认为应该发生的异常之外的异常,因为这样做会隐藏bug。捕获
psutil.NoSuchProcess
的原因只是为了防止有一个进程在迭代它们所需的短时间内终止(如果父进程确实仍然存在,则父进程已等待它)。我还看到另一个答案也捕获了
psutil.ZombieProcess
。我不确定在什么情况下会出现这种异常,但我已经测试了t