Cuando se utiliza el subprocess.Popen (), stderr y stdout no tienen salida

Estoy usando Python para automatizar una confirmación SVN, y quiero escribir la salida del command SVN en un file de logging. El código que tengo puede hacer que se ejecute SVN, pero el problema es que en una confirmación exitosa, la invocación del subprocess no devuelve ningún resultado para mi logging.

Cuando ejecuto SVN manualmente, en comparación, obtengo un resultado que muestra el progreso del command y muestra qué files están siendo comprometidos. Eso es lo que quiero en mi file de logging. ¿SVN está enviando esos datos a un buffer que stdout o stderr? ¿Cómo puedo capturar esos datos para mi logging?

Aquí está el código que estoy usando:

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

Cuando ejecuto este código y la confirmación es exitosa, las variables out y err están vacías.

No use wait() cuando esté usando PIPE. Use comunicar ()

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

Desde el subprocess documentos :

Advertencia
Utilice communica () en lugar de .stdin.write, .stdout.read o .stderr.read para evitar lockings debido a que cualquiera de los demás búferes de canal del SO se llenan y bloquean el process secundario.

Está trabajando en mi solución:

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