我在里面我是用许多非代码文件Python项目。 目前,这些都是图像,但我可能会使用其他类型的文件在未来。 什么是用于存储和引用这些文件是个好方案?
我认为只是在主目录将文件夹的“资源”,但有一个问题; 有些图片是从我的项目的子包内使用。 存储这些图片这样会导致耦合,这是不利的。
另外,我需要一种方法来访问这些文件,这是独立于我的当前目录是什么。
我在里面我是用许多非代码文件Python项目。 目前,这些都是图像,但我可能会使用其他类型的文件在未来。 什么是用于存储和引用这些文件是个好方案?
我认为只是在主目录将文件夹的“资源”,但有一个问题; 有些图片是从我的项目的子包内使用。 存储这些图片这样会导致耦合,这是不利的。
另外,我需要一种方法来访问这些文件,这是独立于我的当前目录是什么。
您可能需要使用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']})
警告:要测试的东西“本地”,即W / O首先安装的软件包,你必须从具有目录调用你的测试脚本setup.py
。 如果在同一目录是code.py
,Python会不知道proj
包。 所以像proj.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 \工作中,我创建了一个应用程序,topapp.py,如下所示:
import topp
import topp.sub1
import topp.sub2
这respresents使用应用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
正如你所看到的,正确解决实际(子)的位置的资源路径包的路径上。
更新: 这里的相关py2exe文档。
@ pycon2009,有上的distutils和setuptools的介绍。 你可以找到所有的视频在这里
鸡蛋和扩建部署在Python -第1部分
鸡蛋和扩建部署在Python -第2部分
鸡蛋和扩建部署在Python -第3部分
在这些视频中,他们描述了如何在您的包静态资源。 我相信它在第2部分。
随着setuptools的,你可以定义依赖关系,这将让你有2包使用的资源从第3包。
setuptools的也给你访问这些资源的标准方法,并允许你使用你的包,这样就无需担心安装您的包裹,其中内相对路径。