2012-05-02 13 views
8

Estoy usando Python para automatizar una confirmación SVN, y quiero escribir la salida del comando SVN en un archivo de registro. El código que tengo puede hacer que se ejecute SVN, pero el problema es que en una confirmación exitosa, la invocación subprocess no devuelve ningún resultado para mi registro.Al usar el subproceso.Popen(), stderr y stdout no tienen salida

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

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 se realiza correctamente, las variables out y err están vacíos.

+0

¿Cómo se envían los datos de acceso para hacer eso? Estoy intentando lo mismo y no pude encontrar la manera de enviar un nombre de usuario y contraseña para el mismo –

Respuesta

9

No use wait() cuando utiliza PIPE. Utilice la comunicación()

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

out, err = process.communicate() 

Desde el subprocess docs:

Advertencia
Uso comunicarse() en lugar de .stdin.write, .stdout.read o .stderr.read para evitar los puntos muertos debido a cualquiera de los demás tubos del sistema operativo llenan y bloquean el proceso secundario.

0

Está funcionando 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() 
Cuestiones relacionadas