【问题标题】:How to distribute / access data files in Python egg?如何在 Python Egg 中分发/访问数据文件?
【发布时间】:2011-12-29 13:26:39
【问题描述】:

我正在编写一个使用 pip 和 virtualenv 来管理其开发环境的 Django 应用程序。

其中一个依赖项pkgme 带有许多数据文件,这些文件是其“后端”,并在其 setup.py 中配置为data_files=$FOO(而不是package_data)。

当 pkgme​​ 查找其后端时,它会查找 os.path.join(sys.prefix, "share", "pkgme", "backends")。这在 pkgme​​ 已正常安装时效果很好,并且似乎与 documentation 匹配,但当 pkgme​​ 作为鸡蛋安装时 工作。

在那里,数据文件安装在$VIRTUAL_ENV/lib/python2.7/site-packages/pkgme-0.1-py2.7.egg/share 下,而不是预期的$VIRTUAL_ENV/share

这给我留下了两个问题:

  1. 是否应该使用除上述os.path.join 之外的其他工具来查找数据文件,而不管我们是使用egg 安装还是传统系统安装?如果有,是什么?
  2. 我是否应该以不同的方式分发我的数据文件,以使它们在鸡蛋中更容易获得?

请注意,我知道pkgutil.get_data,但不想使用它。我对这些数据文件的内容不感兴趣,我想知道它们的位置,以便执行它们。

我目前的计划是这样做:

  • 使用package_data 而不是data_files
  • 更改 pkgme​​ 以查找相对于 pkgme.__file__ 而不是 sys.prefix 的后端

【问题讨论】:

  • 考虑在 setup.py 中将 zip_safe 设置为 False,这样它就不会生成 .egg 文件。

标签: python setuptools distutils egg


【解决方案1】:

您当前的计划基本上是正确的,或者无论如何是一个可行的选择。

当 setuptools 创建一个 egg 时,它会检查 egg 中的代码是否使用了__file__,如果是,它会将 egg 标记为不能以压缩形式安装。这样,当通过easy_install安装egg时,它会被解压到.egg/目录,而不是留在.egg文件中。

如果你想支持压缩/插入式安装(即,只是将 egg 转储到一个目录中而不“安装”它),那么你应该使用pkg_resources.resource_filename()(docs here) API 而不是__file__,但是那么您的软件包将依赖于 setuptools 或分发,以使该 API 可用。

【讨论】:

  • 感谢 PJE。很高兴了解__file__ 检查。我采用了与我在问题中建议的方法类似的方法,但额外使用了入口点来处理一些后端。
【解决方案2】:

我最终做了以下事情:

  • 将 pkgme​​ 更改为使用 pkg_resources.resource_filename() 来查找自己包含的后端
  • 添加了一个入口点,任何用 Python 编写的后端都可以使用它来发布自己的后端脚本的位置
  • 保留基于 sys.prefix 的检查以检查任何不想使用 Python 的后端

可以在这里找到差异:http://bazaar.launchpad.net/~pkgme-committers/pkgme/trunk/revision/86

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2012-09-25
    • 2018-09-21
    • 2010-09-15
    • 2011-03-05
    • 1970-01-01
    • 2011-04-13
    • 2018-07-26
    相关资源
    最近更新 更多