2009-02-15 20 views
45

में प्रक्रिया नाम से पीआईडी ​​प्राप्त करने के लिए क्रॉस-प्लेटफार्म तरीका मेजबान पर एक ही नाम के साथ कई प्रक्रियाएं चल रही हैं। पायथन या jython का उपयोग करके उन प्रक्रियाओं के पीआईडी ​​प्राप्त करने के लिए क्रॉस-प्लेटफार्म तरीका क्या है?पाइथन

  1. मुझे pidof जैसे कुछ चाहिए लेकिन पाइथन में। (मेरे पास pidof वैसे भी नहीं है।)
  2. मैं /proc को पार्स नहीं कर सकता क्योंकि यह अनुपलब्ध हो सकता है (एचपी-यूएक्स पर)।
  3. मैं os.popen('ps') नहीं चलाऊंगा और आउटपुट को पार्स नहीं करना चाहता क्योंकि मुझे लगता है कि यह बदसूरत है (फ़ील्ड अनुक्रम अलग-अलग ओएस में अलग हो सकता है)।
  4. लक्ष्य प्लेटफ़ॉर्म सोलारिस, एचपी-यूएक्स, और शायद अन्य हैं।

उत्तर

61

आप psutil (https://github.com/giampaolo/psutil) है, जो Windows और यूनिक्स पर काम करता है का उपयोग कर सकते हैं:

import psutil 

PROCNAME = "python.exe" 

for proc in psutil.process_iter(): 
    if proc.name() == PROCNAME: 
     print(proc) 

मेरी मशीन पर यह प्रिंट:

<psutil.Process(pid=3881, name='python.exe') at 140192133873040> 

संपादित करें 2017-04-27 - यहां एक और उन्नत उपयोगिता फ़ंक्शन है जो प्रक्रियाओं के नाम(), cmdline() और exe():

के विरुद्ध नाम की जांच करता है
import os 
import psutil 

def find_procs_by_name(name): 
    "Return a list of processes matching 'name'." 
    assert name, name 
    ls = [] 
    for p in psutil.process_iter(): 
     name_, exe, cmdline = "", "", [] 
     try: 
      name_ = p.name() 
      cmdline = p.cmdline() 
      exe = p.exe() 
     except (psutil.AccessDenied, psutil.ZombieProcess): 
      pass 
     except psutil.NoSuchProcess: 
      continue 
     if name == name_ or cmdline[0] == name or os.path.basename(exe) == name: 
      ls.append(name) 
    return ls 
+0

शामिल होना चाहिए था आपने बहुत उपयोगी मॉड्यूल बनाया है। धन्यवाद। –

+0

कुछ क्लिक और मैं कर रहा हूं (विंडोज़ में भी)। महान। –

+1

दुर्भाग्यवश ओएस एक्स आपको किसी प्रक्रिया (नाम, exe, cmdline) के कई विशेषताओं तक पहुंचने की अनुमति नहीं देता है, भले ही आप केवल उन प्रक्रियाओं तक पहुंचने का प्रयास करें जो आपके द्वारा बनाए गए हैं। जब तक आप सूडो के साथ दुभाषिया/स्क्रिप्ट चलाते हैं, वह है। – John

3

मुझे नहीं लगता कि आप कम से कम पायथन में नहीं, कम से कम पाइथन में/proc या कमांड लाइन उपयोगिता के बिना पूरी तरह से अजगर आधारित, पोर्टेबल समाधान पा सकेंगे। पार्सिंग ओएससिस्टम बदसूरत नहीं है - किसी को कई प्लेटफ़ॉर्म से निपटना होगा, चाहे आप या कोई और हो। जिस ओएस में आप रुचि रखते हैं उसके लिए इसे लागू करना काफी आसान, ईमानदारी से होना चाहिए।

3

पहला, विंडोज़ (इसके सभी अवतारों में) एक गैर-मानक ओएस है।

लिनक्स (और अधिकांश मालिकाना यूनिक्स) पॉज़िक्स-अनुरूप मानक ऑपरेटिंग सिस्टम हैं।

सी पुस्तकालय इस डिचोटोमी को प्रतिबिंबित करते हैं। पायथन सी पुस्तकालयों को प्रतिबिंबित करता है।

ऐसा करने के लिए कोई "क्रॉस-प्लेटफ़ॉर्म" तरीका नहीं है। आपको Windows (XP या Vista)

+0

एक उदाहरण के रूप में लिंक – n611x007

1

की एक विशेष रिलीज के लिए ctypes के साथ कुछ हैक करना होगा, मुझे डर नहीं है। प्रक्रियाओं को विशिष्ट रूप से पहचान द्वारा पिड द्वारा पहचाना जाता है। यदि आपको वास्तव में नाम से एक पिड मिलना चाहिए, तो आपने कुछ सुझाव दिया होगा जैसा आपने सुझाव दिया है, लेकिन यह पोर्टेबल नहीं होगा और शायद सभी मामलों में काम नहीं करेगा।

यदि आपको केवल एक निश्चित एप्लिकेशन के लिए पिड्स ढूंढना है और आपके पास इस एप्लिकेशन पर नियंत्रण है, तो मैं इस ऐप को अपने स्थान को किसी स्थान पर स्टोर करने के लिए बदलने की सलाह दूंगा जहां आपकी स्क्रिप्ट इसे पा सके।

1
Jython के लिए

, अगर जावा 5 प्रयोग किया जाता है, तो आप निम्नलिखित के रूप में जावा प्रक्रिया आईडी प्राप्त कर सकते हैं:

java.lang.management आयात *
पीआईडी ​​= ManagementFactory.getRuntimeMXBean() getName()

से।
+0

कि काम करता है डॉक्स के साथ-साथ स्वागत किया जाएगा, लेकिन मैं किसी अन्य प्रक्रिया की पीआईडी ​​प्राप्त करना चाहते हैं (pidof की तरह है, लेकिन pidof का उपयोग किए बिना) –

11

कोई एकल क्रॉस-प्लेटफार्म एपीआई नहीं है, आपको ओएस की जांच करनी होगी। पॉज़िक्स आधारित उपयोग/proc के लिए। विंडोज उपयोग के लिए निम्नलिखित कोड प्रक्रिया नाम coresponding

from win32com.client import GetObject 
WMI = GetObject('winmgmts:') 
processes = WMI.InstancesOf('Win32_Process') 
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes] 

फिर आप आसानी से प्रक्रियाओं की जरूरत को फ़िल्टर कर सकते के साथ सभी पीआईडी ​​की सूची प्राप्त करने। Win32_Process की उपलब्ध संपत्तियों के बारे में अधिक जानकारी के लिए बाहर की जाँच Win32_Process Class

+0

इस पुस्तकालय अजगर के साथ मानक नहीं आता, कम से कम नहीं 2.7 के साथ। अन्य संस्करणों की जांच नहीं की। –

+1

@ZoranPavlovic हाँ और यह 'pywin32' पैकेज है जो http://sourceforge.net/projects/pywin32/files/pywin32/ बनाता है, जवाब में यह – n611x007

7
import psutil 

process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter()) 
for i in process: 
    print i.name,i.pid 

"YourProcess.exe"

+1

मेरे पास कोई भी हिस्सेदारी नहीं है; मैं अक्सर लोगों को यह कहते हुए सुनता हूं कि सूची समझ हमेशा एक सूची फ़िल्टर करने का सबसे अच्छा तरीका है क्योंकि यह तेज़ है। उदाहरण के लिए 'प्रक्रिया = [procutil.process_iter() में proc के लिए proc proc.name == "YourProcess.exe"] '। – ThorSummoner

0

एक नोट के सभी पीआईडी ​​दें ThorSummoner's comment

process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"]. 

मैं अजगर 3 के साथ डेबियन पर यह कोशिश की है पर, मुझे लगता है कि यह बजाय proc.name() हो गया है proc.name का।