2010-03-23 10 views
10

मैं एक संदर्भ के रूप में उपयोग किया गया है, लेकिन पूरा करने के लिए वास्तव में मैं क्या जरूरत है सक्षम नहीं: Calling an external command in Pythonपाइथन में असीमित पृष्ठभूमि प्रक्रियाएं?

मैं भी इस पढ़ रहा था: http://www.python.org/dev/peps/pep-3145/

हमारी परियोजना के लिए, हम 5 SVN checkouts अद्यतन करने की आवश्यकता है इससे पहले कि हम अपने आवेदन को तैनात कर सकें। मेरे देव पर्यावरण में, जहां उत्पादन तैनाती की तुलना में उत्पादकता के लिए तेजी से तैनाती थोड़ा अधिक महत्वपूर्ण है, मैं प्रक्रिया को तेज करने पर काम कर रहा हूं।

मेरे पास एक बैश स्क्रिप्ट है जो काम कर रही है लेकिन कुछ सीमाएं हैं। मैं निम्नलिखित बैश कमांड के साथ 'अपडेट SVN' कई ऊपर आग:

(svn update /repo1) & (svn update /repo2) & (svn update /repo3) & 

समानांतर में इन सभी चलाने के लिए और यह बहुत अच्छी तरह से काम करता है। मैं इस पैटर्न का उपयोग बाकी निर्माण स्क्रिप्ट में प्रत्येक चींटी निर्माण को फायर करने के लिए भी करता हूं, फिर युद्धों को टॉमकैट में ले जाता हूं।

हालांकि, अगर कोई अपडेट या बिल्ड विफल रहता है तो मेरे पास परिनियोजन रोकने पर कोई नियंत्रण नहीं है।

मैं पाइथन के साथ अपनी बैश स्क्रिप्ट को फिर से लिख रहा हूं इसलिए मेरे पास शाखाओं और तैनाती प्रक्रिया पर अधिक नियंत्रण है।

मैं 'svn update/repo' कमांड को आग लगाने के लिए subprocess.call() का उपयोग कर रहा हूं, लेकिन प्रत्येक अनुक्रमिक रूप से कार्य कर रहा है। मैं कोशिश करता हूं '(svn update/repo) &' और वे सभी बंद हो जाते हैं, लेकिन परिणाम कोड तुरंत लौटता है। तो मेरे पास यह निर्धारित करने का कोई तरीका नहीं है कि कोई विशेष आदेश असीमित मोड में विफल रहता है या नहीं।

import subprocess 

subprocess.call('svn update /repo1', shell=True) 
subprocess.call('svn update /repo2', shell=True) 
subprocess.call('svn update /repo3', shell=True) 

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

उत्तर

18

shell=True का उपयोग न करें। यह आपके svn प्रोग्राम को कॉल करने के लिए शेल का आह्वान करेगा, और यह आपको svn के बजाय शैल का रिटर्न कोड देगा।

repos = ['/repo1', '/repo2', '/repo3'] 
# launch 3 async calls: 
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos] 
# wait. 
for proc in procs: 
    proc.wait() 
# check for results: 
if any(proc.returncode != 0 for proc in procs): 
    print 'Something failed' 
+2

यही वही है जो मैं ढूंढ रहा था। – Geuis

+1

धन्यवाद, यह काम करता है। पृष्ठभूमि में subprocess चलाने के लिए कोई रास्ता है - अब टर्मिनल में दिखा रहा है? (वर्तमान में मैं कामकाजी कमांड के साथ खोला खोल देखता हूं) –

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