python - समस - श्रोणि सूजन बीमारी तस्वीरें




अजगर में प्रोसेस नाम द्वारा पीआईडी ​​प्राप्त करने के लिए क्रॉस-प्लेटफ़ॉर्म का तरीका (6)

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

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

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

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

लिनक्स (और सबसे मालिकाना यूनिक्सन) पीओएसआईएसआईएस-संगत मानक ऑपरेटिंग सिस्टम हैं।

सी पुस्तकालय इस द्वंद्वात्मकता को दर्शाते हैं। पायथन सी पुस्तकालयों को दर्शाता है।

ऐसा करने के लिए कोई "क्रॉस-प्लेटफ़ॉर्म" तरीका नहीं है आपको विंडोज (एक्सपी या विस्टा) की एक विशेष रिलीज के लिए सीटीआईपी के साथ कुछ हैक करना होगा


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

java.lang.management आयात से *
pid = ManagementFactory.getRuntimeMXBean ()। getName ()


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

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 कक्षा की जांच करें


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

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

ThorSummoner की टिप्पणी पर एक नोट

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

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





hp-ux