2010-12-11 8 views
6

मुझे एक के बाद एक से अधिक प्रोग्राम चलाने की ज़रूरत है और वे प्रत्येक कंसोल विंडो में चलते हैं। मैं कंसोल विंडो दिखाना चाहता हूं, लेकिन प्रत्येक प्रोग्राम के लिए एक नई विंडो बनाई गई है। यह कष्टप्रद है क्योंकि प्रत्येक खिड़की को एक नई स्थिति में खोला जाता है जहां से दूसरा बंद होता है और ग्रहण में काम करते समय फोकस करता है।एक विंडोज कमांड प्रॉम्प्ट में अनुक्रमिक रूप से एकाधिक प्रोग्राम चलाएं?

def runCommand(self, cmd, instream=None, outstream=None, errstream=None): 
    proc = subprocess.Popen(cmd, stdin=instream, stdout=outstream, stderr=errstream) 

    while True: 
     retcode = proc.poll() 
     if retcode == None: 
      if mAbortBuild: 
       proc.terminate() 
       return False 
      else: 
       time.sleep(1) 
     else: 
      if retcode == 0: 
       return True 
      else: 
       return False 

मैं जब subprocess.Popen कॉलिंग का उपयोग करके 'cmd' एक कमांड प्रॉम्प्ट खोलकर और फिर proc.stdin.write बुला में स्विच (b'program.exe:

यह प्रारंभिक कोड मैं उपयोग कर रहा था है \ r \ n ')। ऐसा लगता है कि एक कमांड विंडो समस्या हल हो रही है लेकिन अब मैं यह नहीं बता सकता कि पहला प्रोग्राम कब किया जाता है और मैं दूसरा शुरू कर सकता हूं। मैं दूसरे प्रोग्राम को चलाने से पहले पहले प्रोग्राम से लॉग फ़ाइल को रोकना और पूछताछ करना चाहता हूं।

कोई सुझाव यह है कि मैं इसे कैसे प्राप्त कर सकता हूं? क्या एक खिड़की में प्रोग्राम चलाने के लिए कोई दूसरा विकल्प है जो मुझे अभी तक नहीं मिला है?

उत्तर

6

चूंकि आप विंडोज का उपयोग कर रहे हैं, तो आप केवल एक प्रोग्राम को बैच फ़ाइल बना सकते हैं जिसे आप चलाने के लिए चाहते हैं जो सभी एक एकल कंसोल विंडो में निष्पादित होंगे। चूंकि यह एक बैच स्क्रिप्ट है, उदाहरण में दिखाए गए अनुसार आप सशर्त बयान जैसे चीजें कर सकते हैं।

import os 
import subprocess 
import textwrap 

# create a batch file with some commands in it 
batch_filename = 'commands.bat' 
with open(batch_filename, "wt") as batchfile: 
    batchfile.write(textwrap.dedent(""" 
     python hello.py 
     if errorlevel 1 (
      @echo non-zero exit code: %errorlevel% - terminating 
      exit 
     ) 
     time /t 
     date /t 
    """)) 

# execute the batch file as a separate process and echo its output 
kwargs = dict(stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
       universal_newlines=True) 
with subprocess.Popen(batch_filename, **kwargs).stdout as output: 
    for line in output: 
     print line, 

try: os.remove(batch_filename) # clean up 
except os.error: pass 
+0

यह लगभग काम करेगा। मैंने अनिवार्य रूप से एक कमांड प्रॉम्प्ट पर लिखकर वही किया है जिसे मैंने स्वयं खोला है। लेकिन समस्या यह है कि पहले आदेश के बाद मैं रुक नहीं सकता, लॉग फ़ाइल का निरीक्षण करता हूं, और फिर अगले कमांड पर जाता हूं। – Sean

+0

@ सेन: ऐसा लगता है कि आप अपने आदेशों के आमंत्रणों को घुमा सकते हैं, जिसने आपको लॉग फ़ाइल का निरीक्षण करने और निकास कोड निर्धारित करने की अनुमति दी है, जिसे बैच फ़ाइल का निरीक्षण कर सकते हैं और यह निर्धारित करने के लिए उपयोग किया जा सकता है कि 'बाहर निकलना' या जारी रखना है या नहीं। बैच प्रोग्राम 'अगर [त्रुटि] त्रुटि नहीं ...' सशर्त प्रसंस्करण का समर्थन करते हैं। यदि आप रुचि रखते हैं तो मैं यह दिखाने के लिए अपना उत्तर अपडेट कर सकता हूं कि यह कैसे किया जा सकता है। – martineau

+0

धन्यवाद मार्टिनौ। मैंने एररलेवल और बैच फ़ाइलों पर त्वरित खोज की और इसे पाया। सहायता के लिए धन्यवाद! – Sean

0

अनुभाग 17.5.3.1 में। स्थिरांकउपप्रक्रिया मॉड्यूल दस्तावेज में वहाँ subprocess.CREATE_NEW_CONSOLE निरंतर की description है:

नई प्रक्रिया, एक नया कंसोल है बजाय इसके माता-पिता की कंसोल (डिफ़ॉल्ट) इनहेरिट की।

जैसा कि हम देखते हैं, डिफ़ॉल्ट रूप से, नई प्रक्रिया अपने माता-पिता के कंसोल को प्राप्त करती है। खोले जाने वाले कई कंसोल का कारण यह है कि आप अपनी स्क्रिप्ट को एक्लिप्स के भीतर से कॉल करते हैं, जिसमें स्वयं को कंसोल नहीं होता है, इसलिए प्रत्येक उपप्रोसेसर अपना स्वयं का कंसोल बनाता है क्योंकि इसमें कोई कंसोल नहीं होता है। अगर कोई इस व्यवहार को अनुकरण करना चाहता है तो यह पाइथन लिपि चलाने के लिए पर्याप्त है जो pythonw.exe का उपयोग python.exe के बजाय उपप्रोसेसेस बनाता है। दोनों के बीच का अंतर यह है कि पूर्व कंसोल नहीं खोलता है जबकि बाद वाला करता है।

समाधान सहायक है स्क्रिप्ट है - चलिए इसे लॉन्चर पर कॉल करें - जो डिफ़ॉल्ट रूप से कंसोल बनाता है और उप-प्रोसेस में आपके प्रोग्राम चलाता है। इस तरह प्रत्येक कार्यक्रम को एक और एक ही कंसोल विरासत में मिलता है - लॉन्चर। अनुक्रमिक रूप से प्रोग्राम चलाने के लिए हम Popen.wait() विधि का उपयोग करते हैं।

--- script_run_from_eclipse.py ---

import subprocess 
import sys 

subprocess.Popen([sys.executable, 'helper.py']) 

--- helper.py ---

import subprocess 

programs = ['first_program.exe', 'second_program.exe'] 
for program in programs: 
    subprocess.Popen([program]).wait() 
    if input('Do you want to continue? (y/n): ').upper() == 'N': 
     break 
संबंधित मुद्दे