2010-09-21 75 views
55

我用Python寫一些監視腳本,我試圖找到讓因爲程序的名稱如何在Unix或Linux中使用Python獲取程序的進程ID?

ps -ef | grep MyProgram 

任何隨機正在運行的程序的進程ID最徹底的方法我可以解析,它的輸出,但是我覺得有可能是蟒蛇有更好的方式

+0

如果你想進行跨領域平臺(例如Linux,Mac,Solaris等),沒有比解析「pf」輸出更好的方法。如果是針對單個非常特定的平臺,請編輯您的Q以添加明顯至關重要的信息(確切的操作系統版本,您需要定位)*和*標籤! – 2010-09-21 15:08:24

+0

你可以直接用python解析ps的輸出 – Mark 2010-09-21 15:10:32

回答

9

嘗試pgrep。它的輸出格式更簡單,因此更易於解析。

222

From the standard library

os.getpid() 
+21

這樣就可以得到python進程的pid,而不是用戶要求的 – Mark 2010-09-21 15:09:51

+65

然而,它是問題標題的一個很好的答案 – 2014-11-25 21:06:17

+10

是的,它給了我什麼來到這裏。 – Jorvis 2016-09-06 16:23:21

14

如果你不想限制自己的標準庫,我喜歡psutil

例如找到所有的 「蟒蛇」 的過程:

>>> import psutil 
>>> [p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']] 
[{'name': 'python3', 'pid': 21947}, 
{'name': 'python', 'pid': 23835}] 
+0

你能否提供一個相同的例子。 – 2017-05-03 09:29:54

+0

缺乏示例 – Paullo 2018-01-20 09:37:00

3

對於Windows

一個辦法讓你的計算機上的程序所有的PID,而無需下載任何模塊:

import os 

pids = [] 
a = os.popen("tasklist").readlines() 
for x in a: 
     try: 
     pids.append(int(x[29:34])) 
     except: 
      pass 
for each in pids: 
     print(each) 

如果你只是想一個程序或具有相同名稱的所有程序和你想要的殺死進程或東西:

import os, sys, win32api 

tasklistrl = os.popen("tasklist").readlines() 
tasklistr = os.popen("tasklist").read() 

print(tasklistr) 

def kill(process): 
    process_exists_forsure = False 
    gotpid = False 
    for examine in tasklistrl: 
      if process == examine[0:len(process)]: 
       process_exists_forsure = True 
    if process_exists_forsure: 
     print("That process exists.") 
    else: 
     print("That process does not exist.") 
     raw_input() 
     sys.exit() 
    for getpid in tasklistrl: 
     if process == getpid[0:len(process)]: 
       pid = int(getpid[29:34]) 
       gotpid = True 
       try: 
        handle = win32api.OpenProcess(1, False, pid) 
        win32api.TerminateProcess(handle, 0) 
        win32api.CloseHandle(handle) 
        print("Successfully killed process %s on pid %d." % (getpid[0:len(prompt)], pid)) 
       except win32api.error as err: 
        print(err) 
        raw_input() 
        sys.exit() 
    if not gotpid: 
     print("Could not get process pid.") 
     raw_input() 
     sys.exit() 

    raw_input() 
    sys.exit() 

prompt = raw_input("Which process would you like to kill? ") 
kill(prompt) 

這只是我的一個進程kill程序的貼我可以使它好多了,但它是好的。

-1

該任務可以使用下面的一段代碼來解決,[0:28]是名稱被保存的區間,而[29:34]包含實際的pid。

import os 

program_pid = 0 
program_name = "notepad.exe" 

task_manager_lines = os.popen("tasklist").readlines() 
for line in task_manager_lines: 
    try: 
     if str(line[0:28]) == program_name + (28 - len(program_name) * ' ': #so it includes the whitespaces 
      program_pid = int(line[29:34]) 
      break 
    except: 
     pass 

print(program_pid) 
4

另外: Python: How to get PID by process name?

適應以前發佈的答案。

def getpid(process_name): 
    import os 
    return [item.split()[1] for item in os.popen('tasklist').read().splitlines()[4:] if process_name in item.split()] 

getpid('cmd.exe') 
['6560', '3244', '9024', '4828'] 
0

對於POSIX(Linux操作系統,BSD等..只需要安裝/ proc目錄)更容易在/ proc

作品在Python 2和3操作系統文件的工作(唯一的不同之處在於異常樹,因此「除外例」,我不喜歡但保持兼容性。也可以創建自定義異常。)

#!/usr/bin/env python 

import os 
import sys 


for dirname in os.listdir('/proc'): 
    if dirname == 'curproc': 
     continue 

    try: 
     with open('/proc/{}/cmdline'.format(dirname), mode='rb') as fd: 
      content = fd.read().decode().split('\x00') 
    except Exception: 
     continue 

    for i in sys.argv[1:]: 
     if i in content[0]: 
      # dirname is also the number of PID 
      print('{0:<12} : {1}'.format(dirname, ' '.join(content))) 

樣本輸出(它的工作原理是p纖ep):

phoemur ~/python $ ./pgrep.py bash 
1487   : -bash 
1779   : /bin/bash 
1

隨着psutil

(可以用[sudo] pip install psutil安裝)

import psutil 

# Get current process pid 
current_process_pid = psutil.Process().pid 
print(current_process_pid) # e.g 12971 

# Get pids by program name 
program_name = 'chrome' 
process_pids = [process.pid for process in psutil.process_iter() if process.name == program_name] 
print(process_pids) # e.g [1059, 2343, ..., ..., 9645] 
相關問題