如何在Python egg中分发/访问数据文件?

时间:2011-11-15 13:54:40

标签: python setuptools distutils egg

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

其中一个依赖项pkgme附带了许多数据文件,这些文件是其“后端”,并在其setup.py中使用data_files=$FOO(而不是package_data)进行配置。 / p>

当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以外的其他内容来查找数据文件,无论我们使用的是鸡蛋安装还是传统的系统安装?如果是,那是什么?
  2. 我应该以不同方式分发我的数据文件,以便更容易在鸡蛋中使用它们吗?
  3. 请注意,我知道pkgutil.get_data,但不想使用它。我对这些数据文件的内容不感兴趣,我想知道他们的位置,所以我可以执行它们。

    我目前的计划是这样做:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

我最终做了以下事情:

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

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