Mar*_*eld 20 python io stdout ioerror
我继承了一些代码,这些代码由于在打印调用期间引发输入/输出错误而定期(随机)失败.我试图确定引发异常的原因(或至少,更好地理解它)以及如何正确处理它.
执行以下Python行时(在2.6.6解释器中,在CentOS 5.5上运行):
print >> sys.stderr, 'Unable to do something: %s' % command
Run Code Online (Sandbox Code Playgroud)
引发异常(省略回溯):
IOError: [Errno 5] Input/output error
Run Code Online (Sandbox Code Playgroud)
对于上下文,这通常是当时较大的函数尝试执行的操作:
from subprocess import Popen, PIPE
import sys
def run_commands(commands):
for command in commands:
try:
out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate()
print >> sys.stdout, out
if err:
raise Exception('ERROR -- an error occurred when executing this command: %s --- err: %s' % (command, err))
except:
print >> sys.stderr, 'Unable to do something: %s' % command
run_commands(["ls", "echo foo"])
Run Code Online (Sandbox Code Playgroud)
该>>语法是不是特别熟悉我,这不是我经常用的,我明白,这也许是最不可取的方式写入标准错误.但是我不相信替代方案会解决潜在的问题.
从我读过的文档来看,IOError 5经常被误用,并且有些松散地定义,不同的操作系统使用它来覆盖不同的问题.在我的例子中我能看到的最好的是python进程不再附加到终端/ pty.
最好的我什么也说不出来就是将进程从stdout/stderr流断开 - 终端仍然是开放的,例如,一切'看起来'都没问题.这可能是由于子流程以不洁的方式终止而造成的吗?还有什么可能是导致此问题的原因 - 或者我可以引入哪些其他步骤来进一步调试?
在处理异常方面,我显然可以捕获它,但我假设这意味着我将无法打印到stdout/stderr以执行剩余的操作?我可以重新连接到这些流不知何故-也许通过重置sys.stdout来sys.__stdout__等?在这种情况下,不能写入stdout/stderr不被认为是致命的,但如果它表明一些事情开始出错,我宁愿早点保释.
我想最终我有点不知道从哪里开始调试这个......
jmk*_*mkg 12
我认为这与流程附加的终端有关.当我在后台运行python进程并关闭我启动它的终端时,我收到此错误:
$ myprogram.py
Ctrl-Z
$ bg
$ exit
Run Code Online (Sandbox Code Playgroud)
问题是我在远程服务器中启动了一个未守护进程并注销(关闭终端会话).解决方案是在远程服务器上启动screen/tmux会话,并在此会话中启动该进程.然后分离会话+注销会使终端与进程保持关联.这至少在*nix世界中起作用.
小智 6
我有一个非常相似的问题.我有一个程序正在使用子进程模块启动其他几个程序.然后,这些子过程将输出打印到终端.我发现当我关闭主程序时,它并没有自动终止子进程(正如我所假设的那样),而是它们一直在运行.因此,如果我终止了主程序,然后它终止了它从*启动,那么子进程不再有一个连接到它们的stdout的终端,并且会抛出一个IOError.希望这对你有所帮助.
*注意:必须按此顺序完成.如果你只是杀死终端,(由于某种原因)会杀死主程序和子进程.
| 归档时间: |
|
| 查看次数: |
24843 次 |
| 最近记录: |