python程序运行完毕句柄会关闭吗_python不释放文件句柄到日志文件

博客作者遇到了一个Python应用程序在运行多次模拟后因文件句柄耗尽导致崩溃的问题。问题在于日志记录机制未能正确关闭日志文件句柄。尝试了在`__del__()`和`__exit__()`方法中关闭处理程序,但未成功。讨论中提出了在文件处理程序上调用`.close()`的方法可能解决这个问题。
摘要由CSDN通过智能技术生成

我有一个应用程序必须运行一些模拟运行。我想设置一个日志记录机制,其中所有日志记录都记录在general.log中,并且模拟运行的所有日志都转到run00001.log,....为此,我定义了一个Run类。在__init__()中为runlog添加了一个新的文件句柄。python不释放文件句柄到日志文件

问题是运行的日志文件永远不会被释放,所以经过多次运行后,可用的句柄耗尽,运行崩溃。

我已经建立了一些程序来测试这个如下

主程序

import Model

try:

myrun = Model.Run('20130315150340_run_49295')

ha = raw_input('enter')

myrun.log.info("some info")

except:

traceback.print_exc(file=sys.stdout)

ha = raw_input('enter3')

类运行的模块型号定义如下

import logging

class Run(object):

""" Implements the functionality of a single run. """

def __init__(self, runid):

self.logdir="."

self.runid = runid

self.logFile = os.path.join(self.logdir , self.runid + '.log')

self.log = logging.getLogger('Run'+self.runid)

myformatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')

myhandler = logging.FileHandler(self.logFile)

myhandler.setLevel(logging.INFO)

myhandler.setFormatter(myformatter)

self.log.addHandler(myhandler)

然后我用的是程序进程资源管理器跟随文件处理程序。我看到runlogs出现,但从不消失。

有没有办法强制这个?

2013-03-15

Bart P.

+1

为什么不能再删除处理程序运行完成的时候?想必你可以勾起那个事件? –

2013-03-15 15:04:43

+0

有关如何做到这一点的任何建议?我已经尝试在__del __()中指定self.log.removeHandler(myhandler),即使通过显式调用析构函数(myrun .__ del __())。我也试过在__exit __()中指定并使用with语句,正如打开文件句柄所建议的那样。但迄今为止没有成功。 –

2013-03-15 19:21:32

+1

您还需要在文件处理程序上调用'.close()'。 'self.log.handlers [0] .close()'应该够了,真的。 –

2013-03-15 20:47:18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值