在Python项目中管理资源
我有一个Python项目,其中正在使用许多非代码文件。当前这些都是图像,但是将来我可能会使用其他类型的文件。什么是存储和引用这些文件的好方案?
我考虑过只在主目录中创建一个文件夹“
resources”,但是有一个问题。一些图像是在我的项目的子包中使用的。以这种方式存储这些图像将导致耦合,这是一个缺点。
另外,我需要一种独立于当前目录的访问这些文件的方法。
-
您可能要使用
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
不会解决。