Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pip installing data files to the wrong place

The source for the package is here

I'm installing the package from the index via:

easy_install hackertray
pip install hackertray

easy_install installs images/hacker-tray.png to the following folder:

/usr/local/lib/python2.7/dist-packages/hackertray-1.8-py2.7.egg/images/

While, pip installs it to:

/usr/local/images/

My setup.py is as follows:

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'])])

My MANIFEST file is:

include images/hacker-tray.png
like image 687
Nemo Avatar asked Nov 30 '13 09:11

Nemo


People also ask

How do I change the default install location for pip?

Click on the Advanced system settings link on the left panel. Click Environment Variables. Under System Variables, double-click the variable PATH. Click New, and add the directory where pip is installed, e.g. C:Python\Scripts, and select OK.

Where is pip PATH stored?

This file is located at %APPDATA%\pip\pip. ini. You can also specify a custom path location for this config file using the environment variable PIP_CONFIG_FILE.


1 Answers

Don't use data_files with relative paths. Actually, don't use data_files at all, unless you make sure the target paths are absolute ones properly generated in a cross-platform way insted of hard coded values.

Use package_data instead:

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

where hackertray.data is a proper python package (i.e. is a directory that contains a file named __init__.py) and hacker-tray.png is right next to __init__.py.

Here's how it should look:

.
|-- hackertray
|   |-- __init__.py
|   `-- data
|       |-- __init__.py
|       `-- hacker-tray.png
`-- setup.py

You can get the full path to the image file using:

from pkg_resources import resource_filename
print os.path.abspath(resource_filename('hackertray.data', 'hacker-tray.png'))

I hope that helps.

PS: Python<2.7 seems to have a bug regarding packaging of the files listed in package_data. Always make sure to have a manifest file if you're using something older than Python 2.7 for packaging. See here for more info: https://groups.google.com/d/msg/python-virtualenv/v5KJ78LP9Mo/OiBqMcYVFYAJ

like image 110
Burak Arslan Avatar answered Sep 21 '22 03:09

Burak Arslan