Упаковка ресурсов с помощью setuptools/distribute

Я разрабатываю яйцо Python, которое имеет несколько зависимостей .txt (это шаблоны, используемые для создания файлов самим яйцом), и я изо всех сил пытаюсь скопировать эти зависимости в site-packages во время setup.py install. Согласно distribute документации...

Файловая система моего пакета:

setup.py
package
|--- __init__.py
|--- main.py
|--- binary (calls main.py with pkg_resources.load_entry_point)
|--- templates
     |--file1.txt
     |--file2.txt

В setup.py:

setup(
    [...]
    eager_resources = ['templates/file1.txt', 'templates/file2.txt']
)

В моем пакете:

from pkg_resources import resource_string
tpl = resource_string(__name__, 'templates/file1.txt')

... эта комбинация конфигурации и файловой системы должна привести к тому, что file1.txt и file2.txt будут доступны через pkg_resources.resource_string. К сожалению, они не копируются в site-packages в течение setup.py install. Что мне не хватает?

Спасибо!


person Community    schedule 13.11.2009    source источник


Ответы (1)


Вы смотрели документацию setuptools для включения данных пакета здесь: http://peak.telecommunity.com/DevCenter/setuptools#Include-data-files

По сути, вам просто нужно установить include_package_data=True в файле setup.py. Если вы используете subversion или CVS, все файлы с версиями будут включены. Если нет, вы можете указать, какие файлы включать в файл MANIFEST.in.

Я считаю, что дистрибутив также поддерживает это.

Затем вы можете получить доступ к файлам, как если бы они не были упакованы. то есть в main.py вы могли бы:

import os.path
f = open(os.path.join(os.path.dirname(__file__),'templates','file1.txt'))
print f.read()
f.close()

и это будет работать и в упакованной версии. Одно предостережение: вам также нужно будет установить zip_safe = False в setup.py, чтобы все файлы были распакованы во время установки.

person pcardune    schedule 14.11.2009
comment
Отлично, спасибо за помощь. Не могли бы вы пояснить разницу между файлами данных и ресурсами, как это определено в документации setuptools, на которую вы ссылались? Я следовал инструкциям для ресурсов, но они оказались качественно другими. Спасибо! - person ; 14.11.2009
comment
Что ж, ваш вопрос был первым, когда я столкнулся с ресурсами, поэтому мне тоже любопытно, для чего они нужны. Но файлы данных определенно подходят для таких вещей, как шаблоны. - person pcardune; 14.11.2009
comment
Обратите внимание, что вам не нужно использовать zip_safe=False. Вместо этого используйте pkg_resources.resource_stream('packagename', 'templates/file1.txt').read() и setuptools получит для вас поток из файловой системы или из заархивированного яйца. - person Jason R. Coombs; 12.04.2010
comment
В документации особо не рекомендуется использовать доступ типа __file__ для упакованных данных (peak .telecommunity.com/DevCenter/). Используйте API управления ресурсами, как это уже использовал OP, и как @JasonR — предположил Кумбс. - person brianmearns; 24.01.2013
comment
Это решение работает только при использовании файла манифеста или системы контроля версий. Есть ли способ сделать это, используя только аргументы package_data (или eager_resources) setup? - person Martin; 06.07.2018