【问题标题】:Python IOError: [Errno 24] Too many open filesPython IOError:[Errno 24] 打开的文件太多
【发布时间】:2014-02-04 05:29:58
【问题描述】:

我打算将一个用户代码脚本传递给 python logger,使用 python bdb 运行它,然后将输出记录到一个文件中。

这是我在 python 记录器中的代码:

  try:
    logger._runscript(script_str)
  except bdb.BdbQuit:
    pass
  finally:
    logger.finalize(filename)

其中 logger.finalize 在下面定义为函数 finalizer(output, filename)。

bdb 将生成一个新线程并在执行后调用以下终结器函数:

def finalizer(output, filename): 
  outfile = open(filename , 'a')
  outfile.write(json.dumps(output, indent = 4))
  outfile.close()

这里的输出是执行结果,我们将它写入一个带有文件名的文件。

我测试了终结器函数中的三行代码,它们运行良好。

但是,当从 python 记录器调用它们时,我总是收到以下错误消息:

IOError: [Errno 24] Too many open files: filename

我只打开一个文件,在其末尾附加一个字符串,然后关闭它。为什么“打开的文件太多”?任何人都可以指出我的问题吗?

这里是 TraceBack 信息:

Traceback (most recent call last):
  File "./exec.py", line 95, in <module>
  File "./exec.py", line 82, in main
  File "./exec.py", line 45, in run
  File "path to project/logger.py", line 1321, in exec_script_str
  File "path to project/logger.py", line 1292, in finalize
  File "./exec.py", line 24, in finalizer
IOError: [Errno 24] Too many open files: 'test01.py'

【问题讨论】:

  • 你能显示整个回溯吗?
  • TraceBack 信息已添加,exec.py 中的第 24 行指向 outfile = open(filename , 'a')。我怀疑问题是 pdb 线程无法正确打开/关闭文件?提前致谢!
  • 您可能需要检查程序打开文件的其他位置。这可能不是泄漏的来源。
  • 感谢您的回复。我已经仔细检查了代码。 Finalizer 是唯一打开文件的函数,每次打开后立即关闭。我还是不知道...
  • script_str 怎么样?那是 Python 脚本吗?它会打开任何文件吗?

标签: python ioerror


【解决方案1】:

这看起来不像标准库中的记录器。相反,您似乎正在尝试使用提供沙盒环境的第三方library。限制之一是它禁止文件访问(请参阅line 1233)。

如果您自己创建记录器对象,您可以通过使用适当的标志创建来禁用这些安全检查。

def exec_str_with_user_ns(script_str, user_ns, finalizer_func):
    logger = PGLogger(False, False, False, finalizer_func, disable_security_checks=True)

    try:
        logger._runscript(script_str, user_ns)
    except bdb.BdbQuit:
        pass
    finally:
        return logger.finalize()

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多