2009-06-30 16 views
28

मैं एक सबप्रोसेस चलाने के लिए पायथन में उपप्रोसेस पैकेज का उपयोग कर रहा हूं, जिसे बाद में मुझे मारने की आवश्यकता है। हालांकि, उपप्रोसेस पैकेज के दस्तावेज में कहा गया है कि टर्मिनेट() फ़ंक्शन केवल 2.6पायथन 2.5 में, मैं एक उपप्रजाति को कैसे मारूं?

हम 2.5 के साथ लिनक्स चला रहे हैं और पीछे की संगतता कारणों से मैं 2.6 तक अपग्रेड नहीं कर सकता, वैकल्पिक विकल्प क्या है? मुझे लगता है कि ये कार्य कुछ के लिए सुविधाजनक तरीके हैं।

+1

कूल: यदि मैं जवाब एक साथ गोंद मैं 'पोर्टेबल' कोड! – Blauohr

+1

एक पहले से ही चिपका हुआ पोर्टेबल उत्तर है http://stackoverflow.com/a/8536476/192632 – bogdan

उत्तर

40

आप प्रक्रिया पिड पर os.kill को कॉल करते हैं।

os.kill(process.pid, signal.SIGKILL) 

आप ठीक हैं क्योंकि आप लिनक्स पर हैं। विंडोज उपयोगकर्ता भाग्य से बाहर हैं।

+3

os.kill (p.pid, signal.SIGTERM) अधिक सटीक –

+1

"मारियो 123" SIGTERM भेजता है। "मार -9 123" सिगकी भेजता है। प्रक्रिया के लिए अच्छा रहें और पहले SIGTERM आज़माएं। – Jabba

40

विंडोज पर @ गैरेथ के जवाब पूरा करने के लिए, आप करते हैं:

import ctypes 
PROCESS_TERMINATE = 1 
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, theprocess.pid) 
ctypes.windll.kernel32.TerminateProcess(handle, -1) 
ctypes.windll.kernel32.CloseHandle(handle) 
नहीं

काफी के रूप में के रूप में os.kill(theprocess.pid, 9) सुरुचिपूर्ण, लेकिन यह काम ;-)

6

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

psutil अजगर, का उपयोग कर कई कार्यक्षमताओं की तरह कमांड लाइन उपकरण द्वारा की पेशकश को लागू करने से एक मॉड्यूल एक पोर्टेबल रास्ते में प्रक्रियाओं और प्रणाली उपयोग (सीपीयू, स्मृति) चल के बारे में जानकारी पुन: प्राप्त करने के लिए एक इंटरफेस प्रदान कर रहा है पीएस, शीर्ष, मारो और विंडोज़ टास्क मैनेजर।

यह वर्तमान में अजगर एक अद्वितीय कोड बेस का उपयोग करके 3.1 करने के लिए 2.4 से संस्करणों के साथ लिनक्स, ओएस एक्स, FreeBSD और विंडोज का समर्थन करता है।

4

Thats एक प्रति & pase पूर्ण समाधान:

def terminate_process(pid): 
    # all this shit is because we are stuck with Python 2.5 and 
    # we cannot use Popen.terminate() 
    if sys.platform == 'win32': 
     import ctypes 
     PROCESS_TERMINATE = 1 
     handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid) 
     ctypes.windll.kernel32.TerminateProcess(handle, -1) 
     ctypes.windll.kernel32.CloseHandle(handle) 
    else: 
     os.kill(pid, signal.SIGKILL) 

टिप्पणी के रूप में स्वीकार कर रहा है बग रिपोर्ट;)

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