2011-08-17 26 views
2

嗯,我有一个在Mac OS X上运行的python脚本。现在我需要修改它以支持将SVN工作副本更新到指定的时间。但是,学习后我发现SVN命令只支持将工作副本更新到指定的版本。使用os.popen()的Python错误

因此,我编写了一个函数来grub从命令svn log XXX的信息中找到相应的版本到指定的时间。这是我的解决方案:

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

为了简化问题,我只是在输出中打印前两行。然而,当我执行脚本时,我收到了错误信息:svn:写入错误:损坏的管道

我认为我得到消息的原因是svn命令在我关闭Popen时保持执行。所以出现错误信息。

有没有人可以帮我解决问题?或者给我一个替代解决方案来达到目标​​。谢谢!

+0

你有没有考虑过使用pysvn呢? –

+0

另外'os.popen'已被'subprocess'取代。 – TorelTwiddler

回答

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 
1

请使用pysvn。这很容易使用。或者使用子进程。

你是否错误仍然发生,如果你做的最后:

print process.read() 

而且最好是调用wait(),如果你使用os.popen或子。

+0

在Python中,read()读取所有输出,直到文件句柄关闭。如果一个子进程写入一些字节,等待两个小时,然后再写入一些字节并存在,则执行read()的父进程将等待整个时间。 – guettli