2012-05-02 14 views
8

Bir SVN işlemini otomatikleştirmek için Python kullanıyorum ve SVN komutunun çıktısını bir günlük dosyasına yazmak istiyorum. Sahip olduğum kod, SVN'yi çalıştırabilir, ancak sorun, başarılı bir işlemde, subprocess çağrısının günlüğüm için herhangi bir çıktı döndürmemesidir.Subprocess.Popen() kullanıldığında, stderr ve stdout'un hiçbir çıkışı yok

SVN'yi manuel olarak çalıştırdığımda, karşılaştırmalı olarak, komutun ilerleyişini gösteren ve hangi dosyaların işlendiğini gösteren çıktı alırım. Benim günlük dosyasımda istediğim bu. SVN bu verileri stdout veya stderr'den daha fazla bir tampona mı veriyor? Günlüğüm için bu verileri nasıl kaydedebilirim?

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() 

Bu kodu çalıştırmak ve taahhüt başarılı, out ve err değişkenler hem boş şunlardır:

İşte kullanıyorum kodu.

+0

Bunu nasıl yapmak giriş kimlik gönderebilirim? Aynı şeyi deniyorum ve aynı kullanıcı adı ve parola nasıl gönderileceğini anlayamadım –

cevap

9

PIPE kullanırken wait()'u kullanmayın. nedeniyle kilitlenmeleri önlemek için oldukça .stdin.write, .stdout.read veya .stderr.read daha)

Uyarı
kullanımı (iletişim: subprocess docs itibaren) (

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

out, err = process.communicate() 

iletişim kullanın Diğer tüm OS borusu arabellekleri doldurur ve çocuk sürecini engeller.

0

Benim çözümde çalışıyor:

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() 
İlgili konular