как получить доступ к файлам ресурсов после установки pip в virtual env на python?

#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 следующий 🙂 ?