Упаковка ресурсов Python (Manifest.in vs package_data vs data_files)

Похоже, что ресурсы, отличные от Python, включаются в дистрибутивы Python одним из 4-х способов:

  1. Файл Manifest.in (я не уверен, когда это предпочтительнее, чем package_data или data_files)
  2. package_data в setup.py (для включения ресурсов внутри пакетов импорта python)
  3. data_files в setup.py (для включения ресурсов вне пакетов импорта python)
  4. что-то под названием setuptools-scm (которое, я полагаю, использует вашу систему контроля версий для поиска ресурсов вместо manifest.in или чего-то еще)
  • Какие из них доступны из importlib.resources?
    (Насколько я понимаю, importlib.resources является предпочтительным способом доступа к таким ресурсам.) Если какие-либо из них недоступны через importlib.resources, то как можно/должно один доступ к таким ресурсам?

  • Другие люди в сети ругались за предложение использовать __file__ для поиска пути к ресурсу, потому что установленные дистрибутивы колеса могут храниться в виде zip-файлов, и поэтому не будет даже правильного пути к вашим ресурсам. Когда колеса извлекаются в пакеты сайтов, а когда остаются заархивированными?


person JacKeown    schedule 12.10.2020    source источник


Ответы (1)


Все (1)-(3) поместят файлы в ваш пакет (не знаю о (4)). Во время выполнения importlib.resources сможет получить доступ к любым данным в вашем пакете. По крайней мере, с Python 3.9, который может обращаться к ресурсам в подкаталогах. Раньше вам приходилось делать каждый подкаталог пакетом, добавляя файл __init__.

Что касается того, почему бы не использовать __file__: в системе импорта Python есть несколько странных способов разрешения пакетов. Например, он может искать их в zip-файле, если вы используете Zipapp. У вас может быть даже собственный загрузчик для пакета, из которого вас просят загрузить некоторые ресурсы. Кто знает, где находятся эти ресурсы? Ответ: importlib.resources.

Афаик, колеса не соперник, так как они в распакованном виде.

person Wolfgang Kuehn    schedule 12.10.2020
comment
Спасибо за ваш ответ! Так что я думаю, что ошибся... Я думал, что при установке колеса (которые представляют собой zip-файлы) остаются заархивированными в пакетах сайтов. Однако из вашего ответа я понимаю, что колеса извлекаются и не остаются заархивированными, поэтому использование __file__ в значительной степени является проблемой только в том случае, если вы используете Zipapp или если ваш пакет будет импортирован с использованием пользовательского загрузчика. Это правильно? - person JacKeown; 13.10.2020
comment
Колеса распакованы. Просто сделайте pip -v install wheel (что бывает и с колесом????). Вы получите сообщение о том, что Создан временный каталог: C:\Users\XYZ\AppData\Local\Temp\pip-unpacked-wheel-udmgqd5b - person Wolfgang Kuehn; 14.10.2020
comment
Так правильно ли говорить, что единственные проблемы с использованием __file__, о которых вы знаете, — это Zipapp и пользовательские загрузчики? - person JacKeown; 14.10.2020
comment
Насколько мне известно. Но с Ziapapp также включаются замороженные модули (те самые файлы *.pyd). Если вы хотите читать ресурсы только из модулей, которые вы предоставляете через дистрибутивы исходного кода или колеса, то вы, вероятно, сэкономите. Но также обратите внимание, что установка __file__ системой импорта является необязательной согласно спецификации, см. docs.python.org/3/reference/import.html#__file__ - person Wolfgang Kuehn; 14.10.2020
comment
Спасибо за информацию! - person JacKeown; 14.10.2020