2013-07-10 6 views
5

मैं पिछले कुछ महीनों में खुद को पाइथन पढ़ रहा हूं और आखिर में कुछ उपयोगी चीजें करने शुरू कर रहा हूं।आदेश जारी करने के लिए पायथन का उपयोग

जो मैं अंततः करने की कोशिश कर रहा हूं वह एक पाइथन लिपि है जो कतार के रूप में कार्य करता है। यही है, मैं इनपुट फाइलों के समूह के साथ एक फ़ोल्डर रखना चाहता हूं जो गणना करने के लिए एक और प्रोग्राम उपयोग करता है (मैं एक सैद्धांतिक भौतिक विज्ञानी हूं और एक दिन में कई कम्प्यूटेशनल नौकरियां करता हूं)।

जिस तरह से मुझे यह करना होगा, वह उस बॉक्स पर सभी इनपुट फ़ाइलों को रखता है जिनमें कम्प्यूटेशनल सॉफ़्टवेयर है। फिर मुझे डॉस इनपुट फ़ाइलों को यूनिक्स (डॉस 2unix) में कनवर्ट करना होगा, इसके बाद मुझे नई इनपुट फ़ाइल को 'INPUT' नामक फ़ाइल में कॉपी करना होगा। आखिरकार मैं एक कमांड चलाता हूं जो नौकरी शुरू करता है।

इन सभी कार्यों को कमांड प्रॉम्प्ट में संभाला जाता है। मेरा सवाल यह है कि मैं कमांड प्रॉम्प्ट के साथ अपने प्रोग्राम को कैसे इंटरफ़ेस कर सकता हूं? फिर, मैं प्रक्रिया की निगरानी कैसे कर सकता हूं (जो मैं आमतौर पर सीपीयू उपयोग और टॉप कमांड के माध्यम से करता हूं), और आखिरी नौकरी खत्म होने के बाद ही पाइथन अगले नौकरी शुरू कर सकता है।

रैंपिंग के लिए खेद है, मुझे नहीं पता कि एक स्क्रिप्ट से कमांड प्रॉम्प्ट को कैसे नियंत्रित किया जाए, और उसके बाद यह स्वचालित रूप से नौकरी को 'देखें'।

धन्यवाद

+4

मुझे लगता है कि [subprocess] (http://docs.python.org/2/library/subprocess.html) मॉड्यूल वह है जो आप चाहते हैं। यह एक अच्छा सवाल है, मैं आपको यह दूंगा, लेकिन यहां पर कई [डुप्लिकेट] (http://stackoverflow.com/q/89228/645270) हैं। – keyser

+0

आप वास्तव में एक स्क्रिप्ट से कमांड प्रॉम्प्ट को नियंत्रित करने के लिए कह रहे हैं-मुश्किल है। लेकिन जब कमांड प्रॉम्प्ट आप को नियंत्रित करने के प्रयास कर रहे हैं (इस मामले में, शेल) कुछ भी नहीं कर रहा है तो आप ('subprocess' साथ, इस मामले में) पायथन में और अधिक आसानी से ऐसा नहीं कर सकते, तो आप की जरूरत नहीं है प्रॉम्प्ट को नियंत्रित करें। – abarnert

उत्तर

6

subprocess मॉड्यूल अजगर में प्रणाली आदेशों को क्रियान्वित करने के लिए कई उपकरण है।

from subprocess import call 
call(["ls", "-l"]) 

source

कॉल तो आप एक दूसरे से बाद में जानते हुए भी कि पिछले एक समाप्त हो गया है कॉल कर सकते हैं समाप्त करने और उसके returncode वापस जाने के लिए आदेश के लिए इंतजार करेंगे।

os.system यह करने के लिए एक पुराने तरीका है, लेकिन कम उपकरण है और अनुशंसित नहीं है:

import os 
os.system('"C:/Temp/a b c/Notepad.exe"') 

संपादित FVD explaning कैसे "घड़ी" के लिए

+0

और सबप्रोसेस के भीतर आप ओपन के रूप में, "नौकरी" देखने के लिए Popen.communicate (इनपुट = कोई नहीं) का उपयोग कर सकते हैं। – FvD

+0

'os.system'' subprocess.call' से कहीं अधिक आसान कैसे है? (और एक ही भी कीस्ट्रोक्स की संख्या के बारे में) कुछ और (उन में रिक्त स्थान के साथ बहस की तरह) ऊपर आता है के रूप में अधिक के रूप में जल्द जटिल तुच्छ मामलों में, और यह अवधारणाओं की एक ही नंबर है। डुप्लिकेट मैं से जुड़ा हुआ से – abarnert

+0

मेजर डेजा वू: पी ('os.system' चर्चा के साथ) – keyser

1

नीचे प्रक्रिया कोई टिप्पणी की यदि आपको वास्तव में एक इंटरैक्टिव कमांड लाइन इंटरफ़ेस चलाने की आवश्यकता है, तो stdlib के साथ ऐसा करने का कोई तरीका नहीं है।

इसके लिए कई तृतीय-पक्ष विकल्प हैं; मुझे लगता है कि pexpect शायद सबसे लोकप्रिय है।


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

with Popen(['sort', '-n'], stdin=PIPE, stdout=PIPE) as p: 
    sorted_data = p.communicate(input_data) 

यह निश्चित रूप से एक मूर्खतापूर्ण उदाहरण है, क्योंकि आप कुछ भी sort कर सकते हैं पायथन के sorted एक key तर्क के साथ है, और शायद बहुत से कर सकते हैं अधिक पठनीय रूप से।


अधिक आम तौर पर: अक्सर आप लगता जब आप सहभागी कुछ कार्यक्रम स्क्रिप्ट के क्या तुम सच में नहीं है की जरूरत है, और कभी-कभी तुम भी सब पर इसे चलाने के लिए जरूरत नहीं है।

और आपका विशेष मामला बिल्कुल ऐसा मामला है। आप शैल को इंटरैक्टिव रूप से स्क्रिप्टिंग करने के बारे में पूछ रहे हैं। लेकिन आपको वास्तव में ऐसा करने की आवश्यकता नहीं है, क्योंकि पाइथन शेल से आपको आवश्यक सभी चीजें कर सकता है।

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