3

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

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

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

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

这给我留下了两个问题:

  1. os.path.join无论我们是使用鸡蛋安装还是传统系统安装,我是否应该使用上述以外的东西来查找数据文件?如果是这样,是什么?
  2. 我应该以不同的方式分发我的数据文件,以便让它们更容易在鸡蛋中使用吗?

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

我目前的计划是这样做:

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

2 回答 2

2

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

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

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

于 2011-11-16T15:21:49.107 回答
1

我最终做了以下事情:

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

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

于 2011-11-18T17:02:17.343 回答