我正在编写一个使用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
。
这让我有两个问题:
os.path.join
以外的其他内容来查找数据文件,无论我们使用的是鸡蛋安装还是传统的系统安装?如果是,那是什么?请注意,我知道pkgutil.get_data
,但不想使用它。我对这些数据文件的内容不感兴趣,我想知道他们的位置,所以我可以执行它们。
我目前的计划是这样做:
package_data
代替data_files
pkgme.__file__
而非sys.prefix
答案 0 :(得分:1)
您当前的计划基本上是正确的,或者无论如何都是可行的选择。
当setuptools创建一个egg时,它会检查egg中的代码是否使用__file__
,如果是,它会将egg标记为无法以压缩形式安装。通过这种方式,当通过easy_install安装egg时,它将被解压缩到.egg/
目录,而不是保留在.egg
文件中。
如果你想支持压缩/嵌入式安装(即只是将鸡蛋转储到目录而不“安装”它),那么你应该使用pkg_resources.resource_filename()
(docs here) API而不是{ {1}},但随后您的软件包将依赖于setuptools或分发以使该API可用。
答案 1 :(得分:1)
我最终做了以下事情:
pkg_resources.resource_filename()
查找自己包含的后端sys.prefix
的检查,查看任何不想使用Python的后端差异可以在这里找到:http://bazaar.launchpad.net/~pkgme-committers/pkgme/trunk/revision/86