दिलचस्प पोस्ट
नेस्टेड ऑब्जेक्ट कुंजी के अस्तित्व के लिए जावास्क्रिप्ट परीक्षण जब एक regex में जी अनुप्रयोग उपयोगी है? विंडोज फॉर्म के बीच मूल्यों को पास करना सी # ऐसा क्यों इतनी खतरनाक हो जाता है कि इसका उपयोग नहीं किया जाना चाहिए? मैं एक सटीक समय कैसे प्राप्त कर सकता हूं, उदाहरण के लिए उद्देश्य सी में मिलीसेकंड में? एक चरित्र के यूनिकोड मान प्राप्त करें कठिन समय समझने के लिए git-fetch MySQL त्रुटि 1153 – 'max_allowed_packet' बाइट्स से बड़ा पैकेट मिला एंड्रॉइड डिवाइस के मैं वर्तमान अभिमुखता (गतिविधि इन्फ़ो। SCREEN_ORIENTATION_ *) कैसे प्राप्त करूं? Sys.path.insert (1, पथ) के बजाय sys.path.append (पथ) का उपयोग क्यों करें? क्या मैं विशिष्ट दृश्य नियंत्रक को पॉप कर सकता हूं? मैं विंडोज 7 में एक फ़ोल्डर में लिखने के लिए asp.net अनुमति कैसे दे सकता हूँ? मैं एक WinForms ऐप कैसे पूर्ण स्क्रीन पर जा सकता हूं क्लास कुंजी मान कोडन-अनुरूप नहीं है एक PostgreSQL तालिका में CSV फ़ाइल डेटा कैसे आयात करें?

मैं पायथन से अतुल्यकालिक रूप से एक बाहरी कमांड कैसे चला सकता हूं?

मुझे एक शेल कमांड को एक पायथन स्क्रिप्ट से अतुल्यकालिक चलाने की जरूरत है I इसका मतलब यह है कि मैं अपने पायथन स्क्रिप्ट को चलाना जारी रखना चाहता हूँ, जबकि बाहरी कमांड बंद हो जाती है और जो भी करना है उसे करना है।

मैं इस पोस्ट को पढ़ता हूं:

पायथन में बाहरी कमांड कॉल करना

मैं फिर से चला गया और कुछ परीक्षण किया, और यह os.system() तरह लग रहा है कि मैं का उपयोग करें & कमांड के अंत में इस्तेमाल किया जाएगा काम इतना है कि मैं इसे वापस करने के लिए इंतजार नहीं करना होगा मैं क्या सोच रहा हूं, क्या यह ऐसी बात को पूरा करने का सही तरीका है? मैंने commands.call() की कोशिश की लेकिन यह मेरे लिए काम नहीं करेगा क्योंकि यह बाहरी कमांड पर ब्लॉक करता है

कृपया मुझे बताएं कि इसके लिए os.system() का उपयोग करना उचित है या यदि मुझे किसी अन्य मार्ग की कोशिश करनी चाहिए।

वेब के समाधान से एकत्रित समाधान "मैं पायथन से अतुल्यकालिक रूप से एक बाहरी कमांड कैसे चला सकता हूं?"

सबप्रोसेस। पोपें ठीक उसी तरह करता है जो आप चाहते हैं।

 from subprocess import Popen p = Popen(['watch', 'ls']) # something long running # ... do other stuff while subprocess is running p.terminate() 

(टिप्पणियों से उत्तर को पूरा करने के लिए संपादित करें)

Popen उदाहरण कई अन्य चीजें कर सकते हैं जैसे आप poll() इसे देखने के लिए कर सकते हैं कि यह अभी भी चल रहा है, और आप इसके साथ communicate() कर सकते हैं ताकि यह डेटा स्टडिन पर भेज सके, और इसे समाप्त करने की प्रतीक्षा कर सकें।

यदि आप कई प्रक्रियाओं को समानांतर में चलाना चाहते हैं और फिर उन्हें परिणाम उत्पन्न करते हैं, तो आप निम्न में मतदान की तरह उपयोग कर सकते हैं:

 from subprocess import Popen, PIPE import time running_procs = [ Popen(['/usr/bin/my_cmd', '-i %s' % path], stdout=PIPE, stderr=PIPE) for path in '/tmp/file0 /tmp/file1 /tmp/file2'.split()] while running_procs: for proc in running_procs: retcode = proc.poll() if retcode is not None: # Process finished. running_procs.remove(proc) break else: # No process is done, wait a bit and check again. time.sleep(.1) continue # Here, `proc` has finished with return code `retcode` if retcode != 0: """Error handling.""" handle_results(proc.stdout) 

नियंत्रण प्रवाह थोड़ा सा जटिल है क्योंकि मैं इसे छोटा करने की कोशिश कर रहा हूं – आप अपने स्वाद पर पुन: लागू कर सकते हैं। 🙂

इसने पहले-शुरुआती अनुरोधों को पूरा करने का लाभ पहले दिया है। यदि आप पहली चलने वाली प्रक्रिया पर communicate करते हैं और जो सबसे लंबे समय तक चलने के लिए निकलते हैं, तो अन्य चलने वाली प्रक्रियाएं बेकार में बैठी रहेंगी, जब आप अपने परिणाम संभाल सकते।

मैं क्या सोच रहा हूं कि क्या यह [ओएससिस्टम ()] ऐसी चीज़ को पूरा करने का सही तरीका है?

नहीं, os.system() उचित तरीका नहीं है। यही कारण है कि हर कोई subprocess का उपयोग करने के लिए कहता है

अधिक जानकारी के लिए, http://docs.python.org/library/os.html#os.system पढ़ें

उपप्रक्रिया मॉड्यूल नई प्रक्रियाओं को विकसित करने और उनके परिणामों को पुनः प्राप्त करने के लिए अधिक शक्तिशाली सुविधाएं प्रदान करता है; इस फ़ंक्शन का उपयोग करने के लिए उस मॉड्यूल का उपयोग करना बेहतर है। उपप्रकाशन मॉड्यूल का उपयोग करें विशेष रूप से उपप्रोसेस मॉड्यूल अनुभाग के साथ पुराने कार्य की जगह की जांच करें।

गैर-अवरुद्ध पटकथाओं के साथ आदी [ http://www.noah.org/wiki/Pexpect ] का उपयोग करना यह करने का एक और तरीका है। Pexpect गतिरोध समस्याओं को हल करती है, आप आसानी से पृष्ठभूमि में प्रक्रियाओं को चलाने के लिए अनुमति देता है, और जब आपके प्रक्रिया पूर्वनिर्धारित तार spits, और आम तौर पर इस प्रक्रिया के साथ बातचीत करने के लिए आसान बनाता है जब callbacks के लिए आसान तरीके देता है

मुझे asyncproc मॉड्यूल के साथ अच्छी सफलता मिली है, जो प्रक्रियाओं से आउटपुट के साथ अच्छी तरह से संबंधित है। उदाहरण के लिए:

 import os from asynproc import Process myProc = Process("myprogram.app") while True: # check to see if process has ended poll = myProc.wait(os.WNOHANG) if poll is not None: break # print any new output out = myProc.read() if out != "": print out 

मुझे अजगर में s3270 स्क्रिप्टिंग सॉफ़्टवेयर के उपयोग से 3270 टर्मिनल से कनेक्ट करने का प्रयास करने की एक ही समस्या है। अब मैं इस प्रक्रिया को एक उप-वर्ग की समस्या से हल कर रहा हूं जो मुझे यहां मिली है:

http://code.activestate.com/recipes/440554/

और यहाँ फ़ाइल से लिया नमूना है:

 def recv_some(p, t=.1, e=1, tr=5, stderr=0): if tr < 1: tr = 1 x = time.time()+t y = [] r = '' pr = p.recv if stderr: pr = p.recv_err while time.time() < x or r: r = pr() if r is None: if e: raise Exception(message) else: break elif r: y.append(r) else: time.sleep(max((x-time.time())/tr, 0)) return ''.join(y) def send_all(p, data): while len(data): sent = p.send(data) if sent is None: raise Exception(message) data = buffer(data, sent) if __name__ == '__main__': if sys.platform == 'win32': shell, commands, tail = ('cmd', ('dir /w', 'echo HELLO WORLD'), '\r\n') else: shell, commands, tail = ('sh', ('ls', 'echo HELLO WORLD'), '\n') a = Popen(shell, stdin=PIPE, stdout=PIPE) print recv_some(a), for cmd in commands: send_all(a, cmd + tail) print recv_some(a), send_all(a, 'exit' + tail) print recv_some(a, e=0) a.wait() 

विचार करने के लिए "मुझे इसे वापस करने के लिए इंतजार नहीं करना पड़ता है", सबसे आसान समाधानों में से एक यह होगा:

 subprocess.Popen( \ [path_to_executable, arg1, arg2, ... argN], creationflags = subprocess.CREATE_NEW_CONSOLE, ).pid 

लेकिन … subprocess.CREATE_NEW_CONSOLE द्वारा बनाए गए सुरक्षा जोखिमों की वजह से मैंने जो पढ़ा है वह "ऐसी चीज़ को पूरा करने का उचित तरीका" नहीं है। subprocess.CREATE_NEW_CONSOLE झंडा

यहां होने वाली महत्वपूर्ण चीजें नए कंसोल और .pid (रिटर्न प्रोसेस आईडी) बनाने के लिए .pid का उपयोग करते हैं। यदि आप प्रोग्राम को इसके काम खत्म करने के लिए इंतजार नहीं करने के लिए इंतजार न करें