2012-05-02 121 views
8

我使用Python來自動化SVN提交,並且我想將SVN命令的輸出寫入日誌文件。我擁有的代碼可以讓SVN運行,但問題是,在成功提交時,subprocess調用不會爲我的日誌返回任何輸出。當使用subprocess.Popen(),stderr和stdout沒有輸出

當我手動運行SVN時,通過比較,我得到的輸出顯示了命令的進度並顯示哪些文件正在提交。這就是我想要的日誌文件。 SVN將數據輸出到緩衝區而不是stdout或stderr?我如何爲我的日誌捕獲這些數據?

下面是我使用的代碼:

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

當我運行此代碼,並提交成功,outerr變量都是空的。

+0

你如何發送的登錄憑據這樣做呢?我試圖相同,並不知道如何發送用戶名和密碼相同 –

回答

9

當您使用PIPE時,請勿使用wait()。使用通信()

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

out, err = process.communicate() 

subprocess docs

警告
使用通信(),而不是.stdin.write,.stdout.read或 .stderr.read,以避免由於死鎖任何其他操作系統管道緩衝區填充和阻塞子進程。

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