पायथन पॉपन कमांड। जब तक कमांड समाप्त न हो जाए तब तक प्रतीक्षा करें


79

मेरे पास एक स्क्रिप्ट है जहां मैं एक शेल कमांड को पॉप करने के साथ लॉन्च करता हूं। समस्या यह है कि स्क्रिप्ट तब तक प्रतीक्षा नहीं करती है जब तक कि पोपेन कमांड समाप्त नहीं हो जाता है और तुरंत जारी रहता है।

om_points = os.popen(command, "w")
.....

मैं अपनी पायथन स्क्रिप्ट को कैसे बता सकता हूं कि शेल कमांड खत्म होने तक इंतजार करें?

जवाबों:


112

आप अपनी स्क्रिप्ट कैसे काम करना चाहते हैं, इसके आधार पर आपके पास दो विकल्प हैं। यदि आप चाहते हैं कि कमांड्स निष्पादित होने के दौरान ब्लॉक और कुछ भी न करें, तो आप बस उपयोग कर सकते हैं subprocess.call।

#start and block until done
subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"])

यदि आप चीजों को निष्पादित करना चाहते हैं, या चीजों को निष्पादित कर रहे हैं stdin, तो आप कॉल के communicateबाद उपयोग कर सकते हैं popen।

#start and process things, then wait
p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"])
print "Happens while running"
p.communicate() #now wait plus that you can send commands to process

जैसा कि प्रलेखन में कहा गया है, waitगतिरोध हो सकता है, इसलिए संचार उचित है।


पर डॉक्स की जाँच करें subprocess.call
— thornomad

जबकि कई जवाबों में सबप्रोसेस को प्राथमिकता दी जाती है, यह बहुत अच्छी तरह से कमांड के भीतर स्थान और कोटा को संभाल नहीं सकता है। उपरोक्त उत्तर सीधे os.popen प्रश्न को हल नहीं करता है।
— चांग


subprocess.run()पायथन 3.5 में जोड़ा गया था और "
— सबप्रोसेस

29

आप इसे subprocessप्राप्त करने के लिए उपयोग कर सकते हैं ।

import subprocess

#This command could have multiple commands separated by a new line \n
some_command = "export PATH=$PATH://server.sample.mo/app/bin \n customupload abc.txt"

p = subprocess.Popen(some_command, stdout=subprocess.PIPE, shell=True)

(output, err) = p.communicate()  

#This makes the wait possible
p_status = p.wait()

#This will give you the output of the command being executed
print "Command output: " + output

उपप्रणाली ओएस सिस्टम की तुलना में 2x धीमी हो सकती है - Bugs.python.org/issue37790
— MonsieurBeilto

12

popenतब तक जारी रखने के लिए बाध्य न करें जब तक कि सभी आउटपुट पढ़कर न हो जाएं:

os.popen(command).read()

2
मैं कोई अजगर विशेषज्ञ नहीं हूं, लेकिन यह सबसे सरल समाधान लगता है जो मूल कोड में सबसे कम संशोधन करता है। किसी भी कारण से यह एक अच्छा समाधान नहीं होगा?
— jdmcnair

7

आज्ञा दें कि आप पास होने का प्रयास कर रहे हैं

os.system('x')

तो आप इसे एक बयान के लिए कवर किया

t = os.system('x')

अब अजगर कमांडलाइन से आउटपुट की प्रतीक्षा कर रहा होगा ताकि इसे चर को सौंपा जा सके t।


4

तुम जो खोज रहे हो वह waitविधि है।


लेकिन अगर मैं टाइप करता हूं: om_point = os.popen (डेटा ["om_point"] + ">" + diz ['d'] + "/ points.xml", "w")। प्रतीक्षा करें () मुझे यह त्रुटि प्राप्त हुई है: Traceback। (सबसे हाल का कॉल अंतिम): फ़ाइल "./model_job.py", पंक्ति 77, में <मॉड्यूल> om_point = os.popen (डेटा ["om_point"] + ">" + diz ['d' + + / अंक .xml "," w ")। प्रतीक्षा करें () विशेषता देखें: 'फ़ाइल' ऑब्जेक्ट में कोई विशेषता नहीं है 'प्रतीक्षा' समस्या क्या है? एक बार फिर धन्यवाद।
— मिशेल

12
आपने मेरे द्वारा दिए गए लिंक पर क्लिक नहीं किया। कक्षा waitकी एक विधि है subprocess।
— ओलिवियर वर्डियर

1
प्रतीक्षा डेडलॉक हो सकती है यदि प्रक्रिया
— स्टडआउट

उपप्रणाली ओएस सिस्टम की तुलना में 2x धीमी हो सकती है - Bugs.python.org/issue37790
— MonsieurBeilto

2

रुको () मेरे लिए ठीक काम करता है। सबप्रोसेस पी 1, पी 2 और पी 3 को एक ही समय में निष्पादित किया जाता है। इसलिए, सभी प्रक्रियाएं 3 सेकंड के बाद की जाती हैं।

import subprocess

processes = []

p1 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
p2 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
p3 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)

processes.append(p1)
processes.append(p2)
processes.append(p3)

for p in processes:
    if p.wait() != 0:
        print("There was an error")

print("all processed finished")

उपप्रक्रिया अप ओएस प्रणाली की तुलना में धीमी 2x करने के लिए हो सकता है - bugs.python.org/issue37790
— MonsieurBeilto

0

मुझे लगता है कि process.communicate () छोटे आकार वाले आउटपुट के लिए उपयुक्त होगा। बड़े आउटपुट के लिए यह सबसे अच्छा तरीका नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.