在Python项目中管理资源

2024-04-19 20:49:32 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

@pycon2009,有一个关于distutils和setuptools的演示。你可以在这里找到所有的视频

Eggs and Buildout Deployment in Python - Part 1

Eggs and Buildout Deployment in Python - Part 2

Eggs and Buildout Deployment in Python - Part 3

在这些视频中,它们描述了如何在包中包含静态资源。我相信这是第二部分。

使用setuptools,您可以定义依赖关系,这将允许您有两个包使用来自第三个包的资源。

Setuptools还为您提供了一种访问这些资源的标准方法,并允许您使用包内的相对路径,这样就无需担心包的安装位置。

您始终可以在每个需要它的子包中有一个单独的“resources”文件夹,并使用os.path函数从子包的__file__值获取这些资源。为了说明我的意思,我在三个位置创建了以下__init__.py文件:

c:\temp\topp        (top-level package)
c:\temp\topp\sub1   (subpackage 1)
c:\temp\topp\sub2   (subpackage 2)

这是__init__.py文件:

import os.path
resource_path = os.path.join(os.path.split(__file__)[0], "resources")
print resource_path

在c:\ temp\work中,我创建了一个应用程序topapp.py,如下所示:

import topp
import topp.sub1
import topp.sub2

这将使用topp包和子包重新呈现应用程序。然后我运行它:

C:\temp\work>topapp
Traceback (most recent call last):
  File "C:\temp\work\topapp.py", line 1, in 
    import topp
ImportError: No module named topp

果然如此。我们将PYTHONPATH设置为模拟包在路径上:

C:\temp\work>set PYTHONPATH=c:\temp

C:\temp\work>topapp
c:\temp\topp\resources
c:\temp\topp\sub1\resources
c:\temp\topp\sub2\resources

如您所见,资源路径正确解析为路径上实际(子)包的位置。

更新:Here是相关的py2exe文档。

您可能想使用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这样的事情不会解决。

相关问题 更多 >