我正在编写一个Django应用程序,它使用pip&virtualenv来管理其开发环境。
其中一个依赖项pkgme带有许多数据文件,这些文件是它的“后端”,并在setup.py中用data_files=$FOO配置(而不是package_data)。
当pkgme查找其后端时,它会查找os.path.join(sys.prefix, "share", "pkgme", "backends")。当pkgme正常安装时,这种方法非常有效,并且似乎与documentation匹配,但当pkgme作为egg安装时则不起作用。
在那里,数据文件安装在$VIRTUAL_ENV/lib/python2.7/site-packages/pkgme-0.1-py2.7.egg/share下,而不是预期的$VIRTUAL_ENV/share下。
我只剩下两个问题:
不管是使用egg安装还是传统的系统安装,我是否应该使用上面os.path.join以外的其他方法来查找数据文件?如果是,怎么办?
我是否应该以不同的方式分发我的数据文件,以使它们更容易在egg中使用?
请注意,我知道pkgutil.get_data,但不想使用它。我对这些数据文件的内容不感兴趣,我想知道它们的位置,所以我可以执行它们。
我现在的计划是:
使用package_data而不是data_files
更改pkgme以查找相对于pkgme.__file__而不是sys.prefix的后端

最佳答案

你目前的计划基本上是正确的,或者至少是可行的。
当setuptools创建一个egg时,它会检查egg中的代码是否使用了__file__,如果是,它会将egg标记为不能以压缩格式安装。这样,当通过easy_install安装egg时,它将被提取到.egg/目录,而不是留在.egg文件中。
如果您想支持压缩/插入式安装(即,只需将egg转储到一个目录中而不“安装”它),那么您应该使用pkg_resources.resource_filename()(docs here)API而不是__file__,但是您的包将依赖于setuptools或distribute以使该API可用。

关于python - 如何在Python egg中分发/访问数据文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8137410/

10-14 18:05