我正在使用Python来自动化SVN提交,我想将SVN命令的输出写入日志文件。我拥有的代码可以使SVN运行,但问题是在成功提交时,subprocess
调用不会为我的日志返回任何输出。
当我手动运行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()
当我运行此代码并且提交成功时,out
和err
变量都是空的。
答案 0 :(得分:9)
使用PIPE时请勿使用wait()
。使用communic()
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, universal_newlines=True)
out, err = process.communicate()
警告
使用communic()而不是.stdin.write,.stdout.read或 .stderr.read以避免由于任何其他OS管道导致的死锁 缓冲填充和阻止子进程。
答案 1 :(得分: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()