2011-06-08 12 views
26

मैं पायथन 2.6 का उपयोग कर रहा हूं। कभी-कभी एक निश्चित प्रक्रिया के कई उदाहरण खुले होते हैं, और यह प्रक्रिया स्वयं में कुछ समस्याएं पैदा करती है। मैं प्रोग्रामिक रूप से यह पता लगाने में सक्षम होना चाहता हूं कि उस प्रक्रिया के कई उदाहरण हैं और उन्हें मारने के लिए।क्या विंडोज़ पर पाइथन के भीतर से एक प्रक्रिया को मारना संभव है?

उदाहरण के लिए, शायद कुछ मामलों में make.exe खोलने के 50 उदाहरण हैं। मैं यह बताने में सक्षम होना चाहता हूं कि 20 उदाहरण खुले हैं, और उन सभी को मारने के लिए। यह कैसे पूरा किया जाता है?

उत्तर

36

मैं और तुम सिर्फ taskkill इस्तेमाल कर सकते हैं लगता होगा अजगर os.system()

import os 
os.system("taskkill /im make.exe") 

नोट: मैं बस ध्यान दें हैं आप पूरी तरह से taskkill पथ अर्हता प्राप्त करना पड़ सकता है। मैं एक लिनक्स बॉक्स का उपयोग कर रहा हूं इसलिए मैं परीक्षण नहीं कर सकता ...

+4

और तुम 'os.popen ('कार्यसूची') का उपयोग कर सकते readlines()' वर्तमान में क्रियान्वित भरोसा कर सकते हैं प्रक्रियाओं की एक सूची प्राप्त करने के लिए, और इस तरह उदाहरणों की संख्या जो आप खोज रहे हैं, सूची में दिखाई देती है और यह निर्धारित करने के लिए कि यह उन सभी को मारने का समय है या नहीं। 'Subprocess.Popen()' का उपयोग थोड़ा अधिक जटिल है, लेकिन 'os.popen() 'को पायथन 2.6 से शुरू कर दिया गया था, इसलिए ध्यान में रखना है। इस प्रकार के कार्य के लिए 'subprocess.Popen()' का उपयोग करने के तरीके के लिए http://stackoverflow.com/questions/3215262/monitor-process-in-python/3215404#3215404 देखें। – JAB

+0

ध्यान दें कि 'os.popen (' tasklist ')। पढ़ा() 'पूरी सूची को एक स्ट्रिंग के रूप में प्राप्त करने के लिए उपयोग किया जा सकता है, यदि एक बड़ी स्ट्रिंग के भीतर एक सबस्ट्रिंग की घटनाओं की गणना करने के लिए' str' फ़ंक्शन है। – JAB

+0

'उपप्रोसेसर।चेक_आउटपुट ('टास्कलिस्ट') 'त्रुटि प्रबंधन – Eric

3

आप प्रक्रिया को मारने के लिए win32 api के TerminateProcess का उपयोग कर सकते हैं। निम्नलिखित उदाहरण देखें: http://code.activestate.com/recipes/347462-terminating-a-subprocess-on-windows/

आपको इसे एक प्रक्रिया संभाल देने की आवश्यकता है। यदि प्रक्रिया आपके कोड से शुरू की गई है, तो प्रक्रिया संभाल CreateProcess या पॉपन द्वारा वापस कर दिया जाता है।

अगर प्रक्रिया किसी और चीज से शुरू की गई थी, तो आपको इसे प्राप्त करने के लिए EnumProcess या WMI का उपयोग करने के लिए इस हैंडल को प्राप्त करने की आवश्यकता है।

+0

ओह पर बहुत बेहतर करेगा, http://timgolden.me.uk/python/wmi/index.html बहुत अच्छा लगता है। – JAB

+1

दुर्भाग्य से टर्मिनप्रोसेस के साथ सिस्टम प्रक्रियाओं को मार नहीं सकता –

2

कैसे इस बारे में, मैं इसे ActiveState अजगर 2.7 के साथ परीक्षण किया:

import sys, traceback, os 

def pkill (process_name): 
    try: 
     killed = os.system('tskill ' + process_name) 
    except Exception, e: 
     killed = 0 
    return killed 

साथ कॉल यह:

pkill("program_name") 
3

हाँ, आप कर सकते हैं यह

import os 
os.system("taskkill /f /im Your_Process_Name.exe") 
  1. /f: निर्दिष्ट करता है कि प्रक्रिया (एस) बलपूर्वक समाप्त हो।
  2. /आईएम (छविनाम): समाप्त होने की प्रक्रिया का छवि नाम निर्दिष्ट करता है।
  3. For more info regarding TaskKill
+0

बस ओएससिस्टम ("टास्ककिल/एफ/आईएम बिटोरोरेंट.एक्सई") के साथ परीक्षण किया गया और यह ठीक काम करता है! पिचर्म कंसोल सफलता पर आउटपुट प्राप्त हुआ: पीआईडी ​​6856 के साथ प्रक्रिया "बिटोरोरेंट.एक्सई" को समाप्त कर दिया गया है। धन्यवाद! – LetzerWille

2

एक अच्छा पार मंच अजगर उपयोगिता psutil है कि एक प्रक्रिया है कि psutil.process_iter साथ() सूचीबद्ध किया जा सकता पर एक kill() दिनचर्या को उजागर करता है।

वहां पहले से ही अन्य सूत्र में एक उदाहरण है:। https://stackoverflow.com/a/4230226/4571444

संबंधित मुद्दे