在Python项目中管理资源

发布于 2021-01-29 17:06:44

我有一个Python项目,其中正在使用许多非代码文件。当前这些都是图像,但是将来我可能会使用其他类型的文件。什么是存储和引用这些文件的好方案?

我考虑过只在主目录中创建一个文件夹“
resources”,但是有一个问题。一些图像是在我的项目的子包中使用的。以这种方式存储这些图像将导致耦合,这是一个缺点。

另外,我需要一种独立于当前目录的访问这些文件的方法。

关注者
0
被浏览
212
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可能要使用pkg_resources随附的库setuptools

    例如,我制作了一个快速的小程序包"proj"来说明我将使用的资源组织方案:

    proj / setup.py
    proj / proj / __ init__.py
    proj / proj / code.py
    proj / proj / resources / __ init__.py
    proj / proj / resources / images / __ init__.py
    proj / proj / resources / images / pic1.png
    proj / proj / resources / images / pic2.png
    

    注意我如何将所有资源保存在单独的子包中。

    "code.py"显示了如何pkg_resources用于引用资源对象:

    from pkg_resources import resource_string, resource_listdir
    
    # Itemize data files under proj/resources/images:
    print resource_listdir('proj.resources.images', '')
    # Get the data file bytes:
    print resource_string('proj.resources.images', 'pic2.png').encode('base64')
    

    如果运行它,则会得到:

    ['__init __。py','__ init __。pyc','pic1.png','pic2.png']
    iVBORw0KGgoAAAANSUhE ...
    

    如果您需要将资源视为文件对象,请使用resource_stream()

    访问资源的代码可能在项目子包结构中的任何位置proj.resources.images,在这种情况下,只需要引用包含全名的图像的子包:即可。

    这是"setup.py"

    #!/usr/bin/env python
    
    from setuptools import setup, find_packages
    
    setup(name='proj',
          packages=find_packages(),
          package_data={'': ['*.png']})
    

    警告:
    要“本地”测试,即首先不安装软件包,您必须从具有的目录中调用测试脚本setup.py。如果您与处于同一目录code.py,则Python将不了解proj软件包。所以类似的事情proj.resources不会解决。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看