使用os.popen()时的Python错误

2 投票
2 回答
2046 浏览
提问于 2025-04-16 23:46

我在Mac OS X上有一个运行的Python脚本。现在我需要修改它,以便可以把我的SVN工作副本更新到指定的时间。不过,我发现SVN命令只支持将工作副本更新到指定的版本。

于是,我写了一个函数,从命令svn log XXX中获取信息,以找到与指定时间对应的版本。以下是我的解决方案:

process=os.popen('svn log XXX')
print process.readline()
print process.readline()
process.close()

为了简化问题,我只打印输出的前两行。但是,当我执行这个脚本时,出现了错误信息:svn: Write error: Broken pipe

我认为出现这个错误的原因是,当我关闭Popen时,svn命令仍在继续执行,所以才会出现这个错误信息。

有没有人能帮我解决这个问题?或者给我一个替代方案来实现这个目标。谢谢!

2 个回答

1

请使用pysvn,这个工具非常简单好用。或者你也可以用subprocess。

如果你最后这样做,错误还会出现吗:

print process.read()

如果你使用os.popen或者subprocess,最好调用wait()。

1

每当我使用 svn log | head 时,也会出现那个错误,这并不是Python特有的问题。你可以试试下面的方式:

from subprocess import PIPE, Popen

process = Popen('svn log XXX', stdout=PIPE, stderr=PIPE)
print process.stdout.readline()
print process.stdout.readline()

这样可以隐藏 stderr 的输出。你也可以直接使用

stdout, stderr = Popen('svn log XXX | head -n2', stdout=PIPE, stderr=PIPE, shell=True).communicate()
print stdout

撰写回答