2013-11-30 1 views
5

источник для пакета hereпип установки файлов данных в неправильном месте

Я устанавливаю пакет из индекса через:

easy_install hackertray 
pip install hackertray 

easy_install устанавливает images/hacker-tray.png в следующую папку:

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

Хотя, pip устанавливает его:

/usr/local/images/ 

Мой 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'])]) 

Мой MANIFEST файл:

include images/hacker-tray.png 

ответ

11

Не используйте data_files с относительными путями. Фактически, вообще не используйте data_files, если только вы не убедитесь, что целевые пути являются абсолютными, которые генерируются должным образом в кросс-платформенном режиме с жестко закодированными значениями.

Использование package_data вместо:

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

где hackertray.data является правильным пакетом питона (т.е. это каталог, который содержит файл с именем __init__.py) и hacker-tray.png находится рядом с __init__.py.

Вот как это должно выглядеть:

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

Вы можете получить полный путь к файлу изображения с помощью:

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

Я надеюсь, что помогает.

PS: Python < У 2.7 есть ошибка, связанная с упаковкой файлов, перечисленных в package_data. Всегда проверяйте файл манифеста, если вы используете что-то старше Python 2.7 для упаковки. Смотрите здесь для получения дополнительной информации: https://groups.google.com/d/msg/python-virtualenv/v5KJ78LP9Mo/OiBqMcYVFYAJ

+0

Несколько уточнений: 1) Что вы имеете в виду, когда вы говорите 'hackertray.data' является _proper питон package_? Мне нужно создать другой пакет только для данных, или он все еще является частью исходного пакета. 2) Я сделал то, что вы сказали, и результирующее распределение по-прежнему не помещает файл изображения в нужное место. Я загрузил пакет [здесь] (http://ge.tt/66oOe871/v/0). – Nemo

+0

Для вашего конкретного случая: 'cd hackertray-1.9; mkdir hackertray/data; touch hackertray/data/__ init__.py; mv hackertray/hacker-tray.png hackertray/data; 'и добавить' hackertray.data' в список 'packages' в setup.py –

+0

Кроме того, я бы просто использовал' find_packages() 'вместо того, чтобы вручную записывать список пакетов , 'from setuptools import find_packages' и передать' packages = find_packages() 'to' setup'. –