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

如何在Python中分发/访问数据文件?,python,setuptools,distutils,egg,Python,Setuptools,Distutils,Egg,我正在编写一个Django应用程序,它使用pip&virtualenv来管理其开发环境 其中一个依赖项随附了许多数据文件,这些文件是其“后端”,并在其setup.py中配置为data\u files=$FOO(而不是package\u data) 当pkgme查找其后端时,它会查找os.path.join(sys.prefix,“share”,“pkgme”,“backends”)。这在pkgme正常安装时非常有效,并且似乎与匹配,但在pkgme作为egg安装时不起作用 在那里,数据文件安装在$

我正在编写一个Django应用程序,它使用pip&virtualenv来管理其开发环境

其中一个依赖项随附了许多数据文件,这些文件是其“后端”,并在其setup.py中配置为
data\u files=$FOO
(而不是
package\u data

当pkgme查找其后端时,它会查找os.path.join(sys.prefix,“share”,“pkgme”,“backends”)。这在pkgme正常安装时非常有效,并且似乎与匹配,但在pkgme作为egg安装时不起作用

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

这给我留下了两个问题:

  • 我是否应该使用上面的
    os.path.join
    以外的其他方法来查找数据文件,而不管我们是使用egg安装还是传统的系统安装?如果是,什么
  • 我是否应该以不同的方式分发我的数据文件,以使它们在鸡蛋中更容易获得
  • 请注意,我知道关于pkgutil.get_data的信息,但不想使用它。我对这些数据文件的内容不感兴趣,而是想知道它们的位置,以便执行它们

    我目前的计划是:

    • 使用
      包数据
      而不是
      数据文件
    • 更改pkgme以查找与
      pkgme.\uuu文件\uuu
      相关的后端,而不是
      sys.prefix

      • 您当前的计划基本上是正确的,或者至少是可行的选择

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


        如果您希望支持压缩/插入式安装(即,只将鸡蛋转储到目录中而不“安装”它),那么您应该使用
        pkg\u resources.resource\u filename()
        API,而不是
        \uuu file\uu
        ,但是,您的软件包将依赖于setuptools或distribute,以使该API可用。

        我最后执行了以下操作:

        • 将pkgme更改为使用
          pkg\u resources.resource\u filename()
          查找自己包含的后端
        • 添加了一个入口点,任何用Python编写的后端都可以使用它来发布自己的后端脚本的位置
        • 对任何不想使用Python的后端保留基于
          sys.prefix
          的检查

        差异可在此处找到:

        谢谢PJE。很高兴了解
        \u文件\u
        检查。我用一个与我在这个问题中建议的方法类似的方法,但是附加的使用入口点来处理一些后端。考虑在StupU.Py中设置<代码> ZIPHAuth< <代码>为false,这样它就不会生成.EAG文件。