2012-05-02 67 views
8

Używam Pythona do automatyzacji zatwierdzenia SVN i chcę zapisać dane wyjściowe polecenia SVN do pliku dziennika. Kod, który mam, może spowodować uruchomienie SVN, ale problem polega na tym, że po pomyślnym zatwierdzeniu wywołanie subprocess nie zwraca żadnych danych wyjściowych do mojego dziennika.Podczas korzystania z podprocesu.Popen(), stderr i stdout nie mają wyjścia

Po uruchomieniu SVN ręcznie, dla porównania, otrzymuję dane wyjściowe, które pokazują postęp polecenia i pokazują, które pliki są zatwierdzane. Właśnie tego chcę w moim pliku dziennika. Czy SVN przesyła dane do bufora niż stdout czy stderr? Jak mogę przechwycić te dane dla mojego logu?

Oto kod używam:

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

Kiedy uruchomić ten kod i zobowiązać się pomyślnie, out i err zmienne są zarówno puste.

+0

Jak wysłać dane logowania to zrobić? Próbuję tego samego i nie mogę wymyślić, jak wysłać nazwę użytkownika i hasło do tego samego –

Odpowiedz

9

Nie używaj wait(), gdy używasz PIPE. Użyj komunikować()

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

out, err = process.communicate() 

Z subprocess docs:

Ostrzeżenie
Zastosowanie komunikować() zamiast .stdin.write, .stdout.read lub .stderr.read aby uniknąć zakleszczenia ze względu na którykolwiek z pozostałych buforów systemu operacyjnego wypełnia i blokuje proces potomny.

0

To działa w moim rozwiązanie:

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() 
Powiązane problemy