2009-08-07 13 views
8

में अक्षम मैं विंडोज पर पायथन 2.5 चलाते हैं, और कोड में कहीं मैं पीआईडी ​​द्वारा IE विंडो को मारने के लिएsubprocess.Popen से सांत्वना उत्पादन अजगर

subprocess.Popen("taskkill /PID " + str(p.pid)) 

है। समस्या यह है कि पॉपन में पाइपिंग स्थापित किए बिना मुझे अभी भी कंसोल पर आउटपुट मिलता है - सफलता: पीआईडी ​​2068 के साथ प्रक्रिया समाप्त कर दी गई है। मैंने subprocess.py में CreateProcess को डीबग किया, लेकिन वहां से नहीं जा सकता।

कोई भी जानता है कि इसे कैसे अक्षम किया जाए?

+0

subprocess.Popen ("taskkill/पीआईडी" + str (p.pid) + 'के साथ समस्या क्या है > एनयूएल ")? –

+0

शायद क्योंकि विंडोज़ पर पाइथन चलता है? यह कहता है कि '>' टास्ककिल कमांड –

+1

का वैध विकल्प नहीं है मैंने पहले कोशिश की, किसी कारण से यह सही ढंग से पार्स नहीं करता है। >>> त्रुटि: अवैध तर्क/विकल्प - '>'। टाइप करें "तास्किल /?" उपयोग के लिए। हालांकि यह cmd लाइन पर काम करता है। – Mark

उत्तर

7
fh = open("NUL","w") 
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh) 
fh.close() 
+0

धन्यवाद! यह टुकड़ा वास्तव में काम करता है। मैं पूरी तरह से एनयूएल के बारे में भूल गया। –

+3

मुझे लगता है कि वहां एक दौड़ की स्थिति है - आप अपने उपप्रोसेसर समाप्त होने से पहले पाइप बंद कर सकते हैं और इसे जल्दी समाप्त कर सकते हैं। –

+0

@chrispy - आप सही हैं, मुझे लगता है कि वहां एक .communicate() होना चाहिए – orip

11
import os 
from subprocess import check_call, STDOUT 

DEVNULL = open(os.devnull, 'wb') 
try: 
    check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT) 
finally: 
    DEVNULL.close() 

मैं हमेशा tuples में पास के रूप में यह मेरे से बचने के बारे में चिंता की बचत होती है उपप्रक्रिया करने के लिए। check_call सुनिश्चित करता है (ए) subprocess से पहले पाइप बंद हो गया है, और (बी) बुलाया प्रक्रिया में विफलता को नजरअंदाज नहीं किया जाता है। अंत में, os.devnull पाइथन 2.4+ में NUL कहने का मानक, क्रॉस-प्लेटफार्म तरीका है।

ध्यान दें कि Py3K में, उपप्रक्रिया आप के लिए DEVNULL प्रदान करता है, तो आप सिर्फ लिख सकते हैं:

from subprocess import check_call, DEVNULL, STDOUT 

check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT) 
संबंधित मुद्दे