2012-05-02 13 views
8

मैं एक एसवीएन प्रतिबद्ध करने के लिए पाइथन का उपयोग कर रहा हूं, और मैं एक लॉग फ़ाइल में एसवीएन कमांड का आउटपुट लिखना चाहता हूं। मेरे पास जो कोड है वह एसवीएन चला सकता है, लेकिन समस्या यह है कि एक सफल प्रतिबद्धता पर, subprocess आमंत्रण मेरे लॉग के लिए कोई आउटपुट वापस नहीं करता है।subprocess.Popen(), stderr और stdout का उपयोग करते समय कोई आउटपुट

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

cmd = "svn commit --non-interactive --no-auth-cache -m 'Automatic commit' ./" 
process = subprocess.Popen(cmd, 
          shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          universal_newlines=True) 
result = process.wait() 

# Output 
out = process.stdout.read() 
err = process.stderr.read() 

मुझे इस कोड चलाने के लिए और प्रतिबद्ध सफल होता है, out और err चर दोनों खाली हैं:

यहाँ कोड मैं का उपयोग कर रहा है।

+0

कैसे आपको लगता है कि ऐसा करने के लिए लॉगिन क्रेडेंशियल भेज सकता हूँ? मैं वही कोशिश कर रहा हूं और यह पता नहीं लगा सकता कि इसके लिए उपयोगकर्ता नाम और पासवर्ड कैसे भेजना है –

उत्तर

9

जब आप पीआईपीई का उपयोग कर रहे हैं तो wait() का उपयोग न करें।

चेतावनी
उपयोग संवाद() के बजाय .stdin.write, .stdout.read या .stderr.read से की वजह से गतिरोध से बचने के लिए: subprocess docs से संवाद()

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, 
      stderr=subprocess.PIPE, universal_newlines=True) 

out, err = process.communicate() 

का प्रयोग करें अन्य ओएस पाइप बफर भरने और बच्चे की प्रक्रिया को अवरुद्ध करने वाले बफर।

0

यह मेरा समाधान में काम कर रहा है:

svn_commit_t = 'svn commit "%s" -m "ticket #%s automerge"' % (directory, tic) 

svn_co = subprocess.Popen(svn_commit_t, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True) 

out, err = svn_co.communicate() 
संबंधित मुद्दे