将数据文件安装到错误的位置

Nem*_*emo 5 python packaging pip package-managers easy-install

包的来源在这里

我正在通过索引安装包:

easy_install hackertray
pip install hackertray
Run Code Online (Sandbox Code Playgroud)

easy_install安装images/hacker-tray.png到以下文件夹:

/usr/local/lib/python2.7/dist-packages/hackertray-1.8-py2.7.egg/images/
Run Code Online (Sandbox Code Playgroud)

同时,pip将其安装到:

/usr/local/images/
Run Code Online (Sandbox Code Playgroud)

我的setup.py如下:

from setuptools import setup
setup(name='hackertray',
      version='1.8',
      description='Hacker News app that sits in your System Tray',
      packages=['hackertray'],
      data_files=[('images', ['images/hacker-tray.png'])])
Run Code Online (Sandbox Code Playgroud)

我的MANIFEST档案是:

include images/hacker-tray.png
Run Code Online (Sandbox Code Playgroud)

Bur*_*lan 12

不要使用data_files相对路径.实际上,根本不要使用data_files,除非您确保目标路径是以跨平台方式正确生成的硬编码值的绝对路径.

package_data改为使用:

setup(
    # (...)
    package_data={
        "hackertray.data": [
            "hacker-tray.png",
        ],
    },
)
Run Code Online (Sandbox Code Playgroud)

哪里hackertray.data是一个合适的python包(即包含一个名为的文件的目录__init__.py),hacker-tray.png紧挨着 __init__.py.

这是它应该看起来的样子:

.
|-- hackertray
|   |-- __init__.py
|   `-- data
|       |-- __init__.py
|       `-- hacker-tray.png
`-- setup.py
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令获取图像文件的完整路径:

from pkg_resources import resource_filename
print os.path.abspath(resource_filename('hackertray.data', 'hacker-tray.png'))
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助.

PS:Python <2.7似乎有关于列出的文件打包的错误package_data.如果您使用比Python 2.7更早的东西进行打包,请始终确保拥有清单文件.有关详细信息,请参阅此处:https://groups.google.com/d/msg/python-virtualenv/v5KJ78LP9Mo/OiBqMcYVFYAJ