#python #resources #virtualenv #python-wheel
Вопрос:
Пусть говорит, что у меня есть эта структура проекта:
src
|my_package
__init__.py
|utils
__init__.py
util.py
|resources
__init__.py
my_resource.yml
В util.py, У меня есть этот код, для работы которого необходим файл ресурсов:
import yaml
import importlib.resources
from my_package import resources
class Util:
def merge_settings(self, settings: dict)->dict:
with importlib.resources.path(resources, 'my_resource.yml') as p:
with open(p) as file:
default_settings = yaml.safe_load(file)
и все отлично работает в моей среде разработки.
Затем я делаю колесо с этим кодом с помощью моего setup.py файл:
import setuptools
import glob
resource_folder = 'my_package/resources'
setuptools.setup(
name="my_package",
version="0.3",
packages=setuptools.find_packages(),
data_files=[(resource_folder, glob.glob(resource_folder r'/*.yml'))]
затем я создаю колесо:
python .setup.py bdist_wheel
и я, наконец, устанавливаю его для использования в другом проекте, используя виртуальную среду с именем my_env:
(my_env) D:dev pip install my_package-0.3-py3-none-any.whl
Но мой код больше не запускается из-за этой строки:
importlib.resources.path(resources, 'my_resource.yml')
Причина обнаружена при изучении папки my_env, my_resource.yml больше нет в my_package.
my_env
|my_package
|resources
my_resource.yml
|Lib
|site-packages
|my_package
|resources
__init__.py
Но это расположение может быть весьма полезно для легкого изменения этого файла… Как я могу одновременно работать с правильным вызовом ресурсов в моей среде разработки и при ее использовании после установки pip ? Я хотел бы всегда иметь доступ к файлу yml для выпуска, когда это необходимо, даже после установки pip…
Tks за вашу помощь
Ответ №1:
ваш data_files
и неверно указан, и не тот параметр, который вы хотите (он предназначен для данных, не входящих в пакет). ключи data_files
вводятся из корня префикса (так что, скажем, вы устанавливаете свой пакет в ./venv
вместо того, чтобы ваши данные заканчивались на ./venv/lib/python#.#/site-packages/my_package/resources/...
том, что они будут заканчиваться на venv/my_package/resources
-определенно не то, что вы хотите!).
фактическая настройка, которую вы хотите, это package_data
:
package_data={
'my_package.resources': '*.yml',
},
сопоставление отображает имена пакетов с точками на глобусы и помещает их внутри пакетов сайта
нет необходимости использовать MANIFEST.in
и т.д. , Так как эти файлы автоматически включаются в ваш пакет
чтобы узнать больше об этом, я снял видео на эту тему
Комментарии:
1. ткс Энтони, и, кстати, отличное видео 😉 Еще один на pyinstaller следующий 🙂 ?