2017-04-07 17 views
8

मैं पाइथन में उपप्रोसेस.पोपेन के साथ कई उपप्रोसेसेस लॉन्च कर रहा हूं। मैं यह जांचना चाहता हूं कि ऐसी कोई प्रक्रिया पूरी हो गई है या नहीं। मुझे उपप्रोसेस की स्थिति की जांच करने के दो तरीके मिल गए हैं, लेकिन दोनों प्रक्रिया को पूरा करने के लिए मजबूर हैं। एक process.communicate() का उपयोग कर रहा है और रिटर्नकोड प्रिंट कर रहा है, जैसा कि here समझाया गया है। कोई अन्य बस प्रक्रिया को कॉल कर रहा है। Wait() और यह जांचता है कि यह 0 लौटाता है।क्या कोई सबप्रोसेस अभी भी चल रहा है या नहीं यह जांचने का कोई तरीका है?

क्या यह जांचने का कोई तरीका है कि कोई प्रक्रिया अभी भी पूरा होने के इंतजार किए बिना चल रही है या नहीं?

+0

['Popen.poll()'] (https://docs.python.org/2/library/subprocess.html#subprocess.Popen.poll)? – asongtoruin

+0

@asongtoruin जो कोई भी प्रिंट नहीं करता है, भले ही प्रक्रिया समाप्त हो जाए। – ahura

+0

प्रक्रिया समाप्त होने के बाद इसे 'कोई नहीं' प्रिंट करना बंद कर देना चाहिए। आप अपने उपप्रजाति को कैसे बुला रहे हैं? – asongtoruin

उत्तर

8

Ouestion: ... a way to check if a process is still running ...

आप उदाहरण के लिए यह कर सकते हैं:

p = subprocess.Popen(... 
""" 
A None value indicates that the process hasn't terminated yet. 
""" 
poll = p.poll() 
if poll == None: 
    # p.subprocess is alive 

Python » 3.6.1 Documentation popen-objects

अजगर के साथ परीक्षण किया गया: 3.4.2

+0

यह "विशेषता त्रुटि: 'पॉपन' ऑब्जेक्ट में कोई विशेषता नहीं है 'प्रक्रिया' – ahura

+1

मैं p.poll कर सकता हूं()। यह प्रक्रिया पूरी होने के बाद भी कोई नहीं देता है। मुझे यह पता है क्योंकि मैं जिस स्क्रिप्ट को कॉल करता हूं वह एक आउटपुट फ़ाइल उत्पन्न करता है जो दिखाई देता है, और फिर भी यह कोई नहीं देता है। इसके अलावा, मैं p.wait() को प्रिंट कर सकता हूं जो 0 देता है, लेकिन प्रिंटिंग p.poll() बाद में अभी भी कोई नहीं देता है। – ahura

+2

सेमेन्टिक्स, लेकिन मुझे विश्वास है कि अगर मतदान कोई नहीं है तो इसे लिखने का पसंदीदा तरीका है। – asongtoruin

0

आप अपने आउटपुट को देखने के लिए subprocess.check_output का उपयोग कर सकते हैं।

इस कोड का प्रयास करें:

import subprocess 
subprocess.check_output(['your command here'], shell=True, stderr=subprocess.STDOUT) 

आशा इस मदद की!

0

myProcessIsRunning = poll() is None 
कर

जैसा कि मुख्य उत्तर द्वारा सुझाया गया है, एक प्रक्रिया चल रही है या नहीं, यह जांचने का सबसे आसान तरीका है। (और यह ज्योथन में भी काम करता है)

यदि आपके पास जांच करने के लिए प्रक्रिया का उदाहरण नहीं है। फिर ऑपरेटिंग सिस्टम टास्कलिस्ट/Ps प्रक्रियाओं का उपयोग करें।

खिड़कियों पर, मेरे आदेश के रूप में दिखाई देगा इस प्रकार है:

filterByPid = "PID eq %s" % pid 
     pidStr = str(pid) 
     commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr", pidStr ] 

यह अनिवार्य रूप से निम्न आदेश पंक्ति के रूप में एक ही बात कर रही है:

cmd /c "tasklist /FI "PID eq 55588" | findstr 55588" 

और लिनक्स पर, मैं बिल्कुल भी ऐसा ही का उपयोग कर:

pidStr = str(pid) 
commandArguments = ['ps', '-p', pidStr ] 

ps कमांड पहले से ही त्रुटि कोड 0/1 को वापस कर देगा n क्या प्रक्रिया मिलती है। विंडोज़ पर आपको स्ट्रिंग कमांड की आवश्यकता होती है।

यह वही दृष्टिकोण है कि followig ढेर अतिप्रवाह धागे पर चर्चा की है है:

Verify if a process is running using its PID in JAVA

नोट: आप यह तरीका अपनाते हैं, याद में
कोशिश अपने आदेश कॉल रैप करने के लिए: foundRunningProcess = subprocess।check_output (argumentsArray, ** kwargs) वापसी सच अं के रूप में अपवाद को छोड़कर: वापसी झूठी

ध्यान दें, सावधान रहना यदि आप वी.एस. कोड के साथ विकसित करने और शुद्ध पायथन और Jython का उपयोग कर रहे हैं। मेरे पर्यावरण पर, मैं इस भ्रम के तहत था कि चुनाव() विधि काम नहीं कर रही थी क्योंकि एक प्रक्रिया जिसे मैंने संदेह किया था कि वास्तव में समाप्त होना चाहिए था। इस प्रक्रिया ने वाइल्डफ्लाई लॉन्च किया था। और जब मैंने जंगली उड़ान को रोकने के लिए कहा था, तो खोल अभी भी उपयोगकर्ता के लिए "जारी रखने के लिए कोई भी कुंजी दबाएं" की प्रतीक्षा कर रहा था।

आदेश में इस प्रक्रिया बंद समाप्त करने के लिए, शुद्ध अजगर में निम्नलिखित कोड काम कर रहा था में:

print >>process.stdin, os.linesep 

और:

process.stdin.write(os.linesep) 

Jython पर, मैं इस प्रकार देखने के लिए इस कोड को ठीक करने के लिए किया था इस अंतर के साथ प्रक्रिया वास्तव में खत्म हो गया था। और jython.poll() ने मुझे यह बताना शुरू कर दिया कि प्रक्रिया वास्तव में समाप्त हो गई है।

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

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