【问题标题】:How to detect if a process is running using Python on Win and MAC如何在 Win 和 MAC 上使用 Python 检测进程是否正在运行
【发布时间】:2011-12-29 11:18:13
【问题描述】:

我正在尝试寻找一种方法来检测进程是否正在使用 Python 在 Windows 操作系统的 Windows 任务管理器和 MAC 操作系统的 Macintosh 活动监视器中运行

有人可以帮我写代码吗?

【问题讨论】:

标签: python process


【解决方案1】:

psutil 是一个跨平台库,用于检索有关正在运行的进程和系统利用率的信息。

import psutil

pythons_psutil = []
for p in psutil.process_iter():
    try:
        if p.name() == 'python.exe':
            pythons_psutil.append(p)
    except psutil.Error:
        pass
>>> pythons_psutil
[<psutil.Process(pid=16988, name='python.exe') at 25793424>]

>>> print(*sorted(pythons_psutil[0].as_dict()), sep='\n')
cmdline
connections
cpu_affinity
cpu_percent
cpu_times
create_time
cwd
exe
io_counters
ionice
memory_info
memory_info_ex
memory_maps
memory_percent
name
nice
num_ctx_switches
num_handles
num_threads
open_files
pid
ppid
status
threads
username

>>> pythons_psutil[0].memory_info()
pmem(rss=12304384, vms=8912896)

在现有的 Windows Python 中,您可以使用 subprocesscsv 解析 tasklist.exe 的输出:

import subprocess
import csv

p_tasklist = subprocess.Popen('tasklist.exe /fo csv',
                              stdout=subprocess.PIPE,
                              universal_newlines=True)

pythons_tasklist = []
for p in csv.DictReader(p_tasklist.stdout):
    if p['Image Name'] == 'python.exe':
        pythons_tasklist.append(p)
>>> print(*sorted(pythons_tasklist[0]), sep='\n')
Image Name
Mem Usage
PID
Session Name
Session#

>>> pythons_tasklist[0]['Mem Usage']
'11,876 K'

【讨论】:

  • 我可以只使用 Python(os/subprocess/任何其他模块)而不使用任何外部模块来做到这一点
  • @jake77,这个答案不叫get_pid_list,也从来没有叫过它。最初我使用get_process_list,但在较新版本的psutil 中不再可用,所以去年我更新了使用process_iter 的答案。这在 psutil 3.2.2 中运行良好。
【解决方案2】:

这是 eryksun 的 Windows 特定解决方案的衍生产品(仅使用内置 python 模块)删除 csv 导入并直接过滤任务列表输出以获得 exe 名称:

import subprocess

def isWindowsProcessRunning( exeName ):                    
    process = subprocess.Popen( 
        'tasklist.exe /FO CSV /FI "IMAGENAME eq %s"' % exeName,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE,
        universal_newlines=True )
    out, err = process.communicate()    
    try   : return out.split("\n")[1].startswith('"%s"' % exeName)
    except: return False

【讨论】:

  • out, err = process.communicate() 包裹在with process: 中以避免ResourceWarnings、管道异常等。将except: 替换为except IndexError 以仅捕获指示isWindowsProcessRunning 应该的索引错误返回False。这避免了对KeyboardInterruptSystemExit 或编程错误异常的虚假抑制。
  • 这个函数太快而且结果太可预测了,不用担心像在它中间尝试尊重键盘中断,或者尝试改进单行命令中的语法错误的调试...这些建议不是“错误的”,而是学术上的矫枉过正。您还赞成一口气压制一些异常,而另一种则暴露其他异常?
  • 在我使用这个时,我最初没有用with process: 包裹communicate(),但是ResourceWarnings 堵塞了我的测试日志,使得很难找到重要的警告/输出。抑制IndexError 是有道理的,因为它实际上不是错误,而是对原始问题的回答:Windows 进程是否以名称exeName 运行? IndexError 表示“不”。其他异常实际上是异常的,应该传播给调用者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2010-12-21
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多