8

我正在使用 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()

当我运行此代码并且提交成功时,outerr变量都是空的。

4

2 回答 2

11

不要wait()在使用 PIPE 时使用。使用通信()

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

out, err = process.communicate()

子流程文档

警告
使用communicate() 而不是.stdin.write、.stdout.read 或.stderr.read 以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。

于 2012-05-02T00:37:28.250 回答
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()
于 2017-10-02T12:40:26.510 回答