首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用open() IOError循环

使用open() IOError循环
EN

Stack Overflow用户
提问于 2014-08-20 10:00:31
回答 1查看 39关注 0票数 0

我正在迭代几个DB记录,并将数据从它们各自的BLOB字段写入文件中:

代码语言:javascript
复制
def build(self, records):
    """
    Builds openimmo.anhang
    """
    result = None
    anh_records = [r for r in records if type(r) == anhaenge]
    if not anh_records:
        return result
    anhang = []
    print('RECORDS: ' + str(len(anh_records)))
    for anh_record in anh_records:
        if anh_record.daten:
            __, path = mkstemp()
            with open(path, 'wb') as target:
                target.write(anh_record.daten)
            anh = openimmo.anhang()
            anh.anhangtitel = anh_record.anhangtitel
            anh.format = 'image/jpeg' #MIMEUtil.getmime(path)
            anh.daten = openimmo.daten()
            anh.daten.pfad = path
            anh.location = id2location.get(anh_record.location)
            anh.gruppe = id2gruppe.get(anh_record.gruppe)
            anhang.append(anh)
    try:
        result.validateBinding()
    except:
        self.log.err('Could not build "anhang": ' + str(result))
    if anhang:
        result = openimmo.anhaenge()
        result.anhang = anhang
    return result

然而,这会产生以下错误:

代码语言:javascript
复制
RECORDS: 5
Message: "[Errno 24] Too many open files: '/tmp/tmpo54qfq'
daemon panic:
Caught unexpected exception in _main() on 2014-08-20 11:53:37.918353
Message: "[Errno 24] Too many open files: '/tmp/tmpo54qfq'" of type "<class 'IOError'>"
Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/homie_core-1.0-py3.2.egg/homie/serv/daemon.py", line 345, in __run
  File "/usr/local/lib/python3.2/dist-packages/homie_core-1.0-py3.2.egg/homie/serv/service.py", line 72, in _main
  File "/usr/local/lib/python3.2/dist-packages/homie_core-1.0-py3.2.egg/homie/api/itf.py", line 127, in export
  File "/usr/local/lib/python3.2/dist-packages/homie_openimmodb-0.2_indev-py3.2.egg/openimmodb/itf.py", line 51, in _retrieve
  File "/usr/local/lib/python3.2/dist-packages/homie_openimmodb-0.2_indev-py3.2.egg/openimmodb/conv.py", line 27, in decode
  File "/usr/local/lib/python3.2/dist-packages/homie_openimmodb-0.2_indev-py3.2.egg/openimmodb/factories/openimmo/immobilie.py", line 60, in build
  File "/usr/local/lib/python3.2/dist-packages/homie_openimmodb-0.2_indev-py3.2.egg/openimmodb/factories/openimmo/anhaenge.py", line 30, in build
IOError: [Errno 24] Too many open files: '/tmp/tmpo54qfq'

根据lsof的说法,整个过程有超过5k个打开的文件:

代码语言:javascript
复制
# lsof| grep python3| wc -l
5375

我检查了几次:当我打开一个文件时,我在代码中的任何地方都使用with open(file) as desc。不应该在每个with块的末尾自动关闭文件,还是我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-20 10:31:49

tempfile.mkstemp()为您打开一个文件:

代码语言:javascript
复制
fd, path = mkstemp()
with open(fd, 'wb') as target:
    # os.close(fd) is called automatically

您不需要打开另一个文件的open(path) (同名)。

您可以使用tempfile.NamedTemporaryFile(delete=False)而不是tempfile.mkstemp()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25401905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档