在Python项目管理资源(Managing resources in a Python proje

2019-07-11 01:24发布

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

我认为只是在主目录将文件夹的“资源”,但有一个问题; 有些图片是从我的项目的子包内使用。 存储这些图片这样会导致耦合,这是不利的。

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

Answer 1:

您可能需要使用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不会解决。



Answer 2:

您可以随时在其需要它的每个子包一个单独的“资源”文件夹中,并使用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文档。



Answer 3:

@ pycon2009,有上的distutils和setuptools的介绍。 你可以找到所有的视频在这里

鸡蛋和扩建部署在Python -第1部分

鸡蛋和扩建部署在Python -第2部分

鸡蛋和扩建部署在Python -第3部分

在这些视频中,他们描述了如何在您的包静态资源。 我相信它在第2部分。

随着setuptools的,你可以定义依赖关系,这将让你有2包使用的资源从第3包。

setuptools的也给你访问这些资源的标准方法,并允许你使用你的包,这样就无需担心安装您的包裹,其中内相对路径。



文章来源: Managing resources in a Python project