【问题标题】:Unclosed File Warning in PythonPython中的未关闭文件警告
【发布时间】:2019-03-12 09:40:06
【问题描述】:

我写了以下代码:

class LazyPackageLoader:
    def __init__(self, package_names):
        self.package_names = package_names

    def install_packages(self):
        try:
            cache = apt.cache.Cache()
            cache.update()
            cache.open()

            for package in self.package_names:
                pkg = cache[package]
                pkg.mark_install()

            cache.commit()

        except Exception as e:
            print (str(e))

        finally:
            cache.close()

    def show_all_packages(self):
        pkgs = list()
        cache = apt.Cache()

        for package in cache:
            if cache[package.name].is_installed:
                pkgs.append(package.name)

        cache.close()
        return pkgs

我这样称呼它:

class TestLazyPackageLoader(unittest.TestCase):
    def test_installed_package(self):
        packagelist = list()
        packagelist.append("ethtool")

        lpl = LazyPackageLoader(packagelist)
        lpl.install_packages()

        packages = lpl.show_all_packages()
        if "ethtool" in packages:
            self.assertEqual(True, True)


if __name__ == '__main__':
    unittest.main()

代码按预期工作,但是我收到以下警告:

ResourceWarning: 未关闭文件 <_io.textiowrapper name="44" mode="w" encoding="UTF-8"> cache.commit

ResourceWarning: 未关闭的文件 <_io.textiowrapper name="43" mode="r" encoding="UTF-8"> cache.commit()

我想警告很简单:存在一个未打开的文件,最终被 Python 关闭。

我一直在阅读这方面的内容,并认为我应该将代码包装在“with”语句中,这对于读取简单的文本文件来说很容易,但我不知道如何使用它图书馆。我认为这里的典型调用是 cache.close,我认为当 finally 被调用时肯定会执行。

【问题讨论】:

    标签: python-3.x apt


    【解决方案1】:

    快速查看python-apt repo 表明apt.cache.Cache() 类实现了with 关键字所需的两个方法,即__enter__()__exit__()

    这意味着你只需要这样做:

    with apt.cache.Cache() as c:
       # ... do your things with c ...
    
    # here, c is closed 
    

    您的代码中的一个示例:

    def show_all_packages(self):
        with apt.cache.Cache() as cache:
            return [package.name for package in cache if cache[package.name].is_installed]
    

    【讨论】:

    • 我接受这个答案是因为它回答了我关于将语句包装在 with 块中的问题。
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多