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




श्रोणि सूजन बीमारी तस्वीरें (7)

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

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

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

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


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

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

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


आप 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

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

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

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

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


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


import psutil

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

"YourProcess.exe" के सभी pids दें


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

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





hp-ux