我正在编写一个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/