【发布时间】:2010-12-24 17:16:45
【问题描述】:
我对 python 2.6.5 有一个奇怪的问题。如果我打电话
p = subprocess.Popen(["ifup eth0"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
随着接口 eth0 关闭,python 程序挂起。 “p.communicate()”需要一分钟或更长时间才能完成。如果接口之前是up,程序运行顺利。我从命令行手动测试了两种情况下的“ifup eth0”,而且速度很快。
如果您知道问题可能是什么,我将不胜感激。
提前致谢
编辑:
根据答案,我尝试了以下方法:
p = subprocess.Popen(["ifup", "eth0"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
如果界面之前已经启动,则脚本运行顺畅。但是,如果接口关闭,python 会再次挂起。我也试过了:
p = subprocess.Popen(["ifup", "eth0"], shell=False)
out, err = p.communicate()
而且一切都运行得非常快。因此,正如 funktku 指出的那样,它可能确实与死锁有关。然而python文档也说python ref:
警告
这会在使用的时候死锁 stdout=PIPE 和/或 stderr=PIPE 和 子进程产生足够的输出 到管道,使其阻塞等待 让操作系统管道缓冲区接受更多 数据。使用communicate() 来避免这种情况。
因此不应该出现死锁。嗯...这是我在命令行上运行程序时的详细输出:
1 案例,接口 eth0 已经启动:
ifup eth0
Interface eth0 already configured
2案例,接口down之前:
ifup eth0
ssh stop/waiting
ssh start/running
所以 ifup 命令生成两行输出以防接口之前关闭,否则生成一行输出。这是我注意到的唯一区别。但我怀疑这是问题的原因,因为“ls -ahl”会导致更多的输出行并且运行良好。
我也尝试过使用 buffersize 参数,但没有成功,将其设置为 4096 之类的大值。
你有什么想法,可能是什么原因?或者这可能是 python 管道处理或 ifup 命令本身的错误?我真的必须使用旧的 os.popen(cmd).read()????
EDIT2:
os.popen(cmd).read() 也有同样的问题。知道如何在命令行上测试 ifup 的管道行为吗?
感谢每一个提示,在此先感谢
【问题讨论】:
-
我还是有这个问题:-(
标签: python linux performance subprocess