2017-01-24 8 views
5

मैं का उपयोग कर subprocess.Popenमॉनिटर उप खिड़कियों

import subprocess

prog = subprocess.Popen(['myprog', args], shell=True)

मैं इस प्रक्रिया 'myprog' पर नजर रखने और इंतजार तक यह पहले समाप्त हो जाता है चाहता हूँ एक कार्यक्रम के उद्घाटन कर रहा हूँ में एक शेल कमांड से बनाए प्रक्रिया मेरी कोड जारी है।

जिस समस्या का सामना कर रहा हूं वह prog.pid है खोल का पीआईडी ​​है और 'myprog' नहीं है और मुझे नहीं पता कि 'myprog' के पीआईडी ​​को कैसे प्राप्त किया जाए। मैं psutil उपयोग करने के लिए prog.pid के बच्चे प्रक्रियाओं पता लगाने की कोशिश:

parent = psutil.Process(prog.pid)
children = parent.children(recursive=True)

लेकिन एक खाली सूची लौटाया जाता है।

दुर्भाग्य से मैं खोल के बिना 'myprog' शुरू करने में सक्षम नहीं हूं। मैं निम्नलिखित त्रुटि संदेश मिलता है जब मैं shell=False साथ कमांड चलाएँ: FileNotFoundError: [WinError 2] The system cannot find the file specified

मैं वेब उच्च और निम्न लेकिन सभी होनहार सुराग गैर Windows उपयोगकर्ताओं के लिए कर रहे हैं खोज की है।

+0

क्या आप वाकई खोल के बिना अपने कार्यक्रम नहीं बना सकते हैं? क्या आप समझा सकते हैं कि आपके प्रश्न में क्यों? शायद वास्तविक कमांड लाइन के साथ। क्योंकि यह ठीक है। –

+0

मैं 'atom path \ to \ file \ to \ open' – EDWhyte

+0

कमांड के साथ एटम खोलने की कोशिश कर रहा हूं और क्या आप' कहां परमाणु 'टाइप कर सकते हैं?हम यहाँ कहीं जा रहे हैं। –

उत्तर

1

आपका atom आदेश शायद एक .cmd फ़ाइल जो एक निष्पादन योग्य है, जिसके लिए shell=True

जरूरत आप अजगर में .bat फ़ाइल फिर से कोडिंग के विस्तार में नहीं जाएंगे बताते हैं की शुरूआत है, लेकिन आप डॉन ' टी निष्पादन योग्य पीआईडी ​​की जरूरत नहीं है।

निष्पादन समाप्त होता है, बैच फ़ाइल समाप्त हो जाती है, इसलिए निगरानी prog.pid के बारे में भूल जाते हैं, बस पर नजर रखने के prog का उपयोग कर poll (बेशक एक ही अजगर स्क्रिप्ट में)।

poll विधि यदि प्रक्रिया समाप्त हो गया है (अगर यह है, यह बाहर निकलने के कोड देता है, अगर यह नहीं यह रिटर्न None है) की जाँच करने के लिए इस गैर ब्लॉक कर रहा है तो आप किसी भी समय आप चाहते हैं कर सकता है की अनुमति देता है, और :

if prog.poll() is not None: 
    # process has ended 
    print("ended") 

की है कि ऐसा करने का अवरुद्ध इंतजार याद दिलाना करते हैं:

return_code = prog.wait() 

लेकिन आपके मामले में, atom.cmd आदेश पृष्ठभूमि में प्रक्रिया शुरू कर रहा है, यह असंभव पीआईडी ​​के बिना नजर रखने के लिए बना रही है।

उस मामले में एक कार्यवाही atom.cmd की प्रतिलिपि बनाना है, start उपसर्ग को अग्रभूमि में निष्पादन योग्य चलाने के लिए हटाएं और इसके बजाय प्रतिलिपि चलाएं।

(या cmd कॉल एक और atom.cmd फ़ाइल के रूप में आप टिप्पणी की, atom.cmd मूल निर्देशिका से फ़ाइल app-1.13.0\resources\cli\atom.cmd पता लगाने और वहाँ start उपसर्ग हटाने के बाद से)

+0

पर है, मैंने' prog.poll' और 'prog.wait()' का उपयोग करने का प्रयास किया है लेकिन यह काफी तेज़ी से समाप्त हो गया है जिसने मुझे विश्वास दिलाया कि मैं 'myprog' – EDWhyte

+0

के बजाय खोल को देख रहा हूं, मेरा संपादन देखें। मुझे लगता है कि एक कामकाज है। –

+0

मैंने टेक्स्ट एडिटर में atom.cmd फ़ाइल खोली और यह सामग्री है: लाइन 1' @ echo off ' लाइन 2' "% ~ dp0 \ .. \ app-1.13.0 \ संसाधन \ cli \ atom.cmd "% *'। मुझे स्टार्ट उपसर्ग – EDWhyte