[英]write error: Broken pipe
我必须在大约300个目录上运行一个工具。 每次运行大约需要1分钟到30分钟甚至更长时间。 所以,我写了一个python脚本,有一个循环,一个接一个地在所有目录上运行该工具。
我的python脚本有类似的代码:
for directory in directories:
os.popen('runtool_exec ' + directory)
但是当我运行python脚本时,我反复收到以下错误消息:
..
tail: write error: Broken pipe
date: write error: Broken pipe
..
我所做的就是使用ssh登录远程服务器,其中保存工具,python脚本和主题目录。 当我使用以下命令从命令提示符单独运行该工具时:
runtool_exec directory
它工作正常。 只有当我使用python脚本运行时,“破管”错误才会出现。 任何想法,解决方法?
您看到的错误是因为您正在使用os.popen()
来运行命令,这意味着管道已打开并连接到命令的stdout
。 每当命令(或其执行的任何内容而不重定向stdout
)想要写入stdout
,它都会尝试写入管道。 但是你没有保留管道,因为你没有在任何地方分配os.popen()
的结果,因此它被Python清理并关闭。 因此,尝试写入它的进程遇到管道损坏,并产生您看到的错误。 ( os.popen()
不重定向stderr
的管道,所以你仍然可以看到错误。)
os.popen()
调用中的另一个问题是,您不检查以确保directory
不包含shell特有的任何字符。 例如,如果目录包含引号,或者*,则可能会发生奇怪的事情。 像这样使用os.popen()
非常糟糕。
你应该使用subprocess.Popen()
,并明确告诉它你要对进程的输出(stdout和stderr)做什么。你传递subprocess.Popen()
一个参数列表(包括你想要启动的东西)而不是单个字符串,它完全避免了shell - 不需要理智 - 检查你的字符串。 如果你真的想忽略输出,你可以这样做:
devnull = open(os.devnull, 'w')
for directory in directories:
subprocess.Popen(['runtool_exec', directory], stdout=devnull)
虽然我强烈建议至少对subprocess.Popen的结果进行一些初步的检查,以查看进程是否过早执行或者是否有错误代码。
如果它对其他人有帮助,同样的问题可能是在shell命令中使用管道(|)的结果。 请参阅此处获取解决方案https://stackoverflow.com/a/4106633/1904913
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.