Управление ресурсами в проекте Python

У меня есть проект Python, в котором я использую много файлов без кода. В настоящее время это все изображения, но я могу использовать другие типы файлов в будущем. Что было бы хорошей схемой для хранения и ссылки на эти файлы?

Я считал, что просто создаю папку «ресурсы» в основном каталоге, но есть проблема; Некоторые изображения используются из подпакетов моего проекта. Хранение этих изображений таким образом приведет к сцеплению, что является недостатком.

Кроме того, мне нужен способ доступа к этим файлам, который не зависит от моего текущего каталога.

  • Python: ulimit и nice для subprocess.call / subprocess.Popen?
  • В python, когда потоки умирают?
  • 3 Solutions collect form web for “Управление ресурсами в проекте Python”

    Вы можете использовать библиотеку pkg_resources которая поставляется с setuptools .

    Например, я составил небольшой пакет "proj" чтобы проиллюстрировать схему организации ресурсов, которую я бы использовал:

      проектируемый / setup.py
     проектируемый / проектируемый / __ init__.py
     проектируемый / проектируемый / code.py
     проектируемый / проектируемый / ресурсы / __ init__.py
     проектируемый / проектируемый / ресурсы / изображения / __ init__.py
     проектируемый / проектируемый / ресурсы / изображения / pic1.png
     проектируемый / проектируемый / ресурсы / изображения / pic2.png
    

    Обратите внимание, как я сохраняю все ресурсы в отдельном субпакете.

    "code.py" показывает, как pkg_resources используется для ссылки на объекты ресурса:

     from pkg_resources import resource_string, resource_listdir # Itemize data files under proj/resources/images: print resource_listdir('proj.resources.images', '') # Get the data file bytes: print resource_string('proj.resources.images', 'pic2.png').encode('base64') 

    Если вы запустите его, вы получите:

      ['__init__.py', '__init __. pyc', 'pic1.png', 'pic2.png']
     iVBORw0KGgoAAAANSUhE ...
    

    Если вам нужно рассматривать ресурс как файл-файл, используйте resource_stream() .

    Код, доступ к ресурсам может быть где угодно внутри структуры подпакета вашего проекта, в этом случае просто нужно ссылаться на подпакет, содержащий изображения, по имени: proj.resources.images .

    Вот "setup.py" :

     #!/usr/bin/env python from setuptools import setup, find_packages setup(name='proj', packages=find_packages(), package_data={'': ['*.png']}) 

    Предостережение. Чтобы проверить вещи «локально», то есть без установки пакета сначала, вам придется вызывать свои тестовые скрипты из каталога с setup.py . Если вы находитесь в том же каталоге, что и code.py , Python не будет знать о пакете code.py . Поэтому такие вещи, как proj.resources , не будут разрешаться.

    Вы всегда можете иметь отдельную папку «resources» в каждом подпакете, которая ей нужна, и использовать функции os.path чтобы получить от __file__ значения __file__ ваших подпакетов. Чтобы проиллюстрировать, что я имею в виду, я создал следующий файл __init__.py в трех местах:

     c: \ temp \ topp (пакет верхнего уровня)
     c: \ temp \ topp \ sub1 (подпакет 1)
     c: \ temp \ topp \ sub2 (подпакет 2)
    

    Вот файл __init__.py :

     import os.path resource_path = os.path.join(os.path.split(__file__)[0], "resources") print resource_path 

    В c: \ temp \ work я создаю приложение topapp.py следующим образом:

     import topp import topp.sub1 import topp.sub2 

    Это представляет приложение, использующее пакет topp и подпакеты. Затем я запускаю его:

     C: \ Temp \ работа> topapp
     Traceback (последний последний вызов):
       Файл «C: \ temp \ work \ topapp.py», строка 1, в 
         import topp
     ImportError: нет модуля с именем topp
    

    Это как и ожидалось. Мы установили PYTHONPATH для моделирования нашего пакета на пути:

     C: \ temp \ work> установить PYTHONPATH = c: \ temp
    
     C: \ Temp \ работа> topapp
     C: \ Temp \ TOPP \ ресурсы
     C: \ TEMP \ TOPP \ sub1 \ ресурсы
     C: \ TEMP \ TOPP \ sub2 \ ресурсы
    

    Как вы можете видеть, пути ресурсов правильно разрешены к расположению фактических (под) пакетов на пути.

    Обновление: вот соответствующая документация py2exe.

    @ pycon2009, была презентация distutils и setuptools. Вы можете найти все видео здесь

    Яйца и развертывание развертывания в Python – часть 1

    Яйца и развертывание развертывания в Python – часть 2

    Яйца и развертывание развертывания в Python – часть 3

    В этих видеороликах они описывают, как включать статические ресурсы в ваш пакет. Я считаю его частью 2.

    С помощью setuptools вы можете определить зависимости, это позволит вам иметь 2 пакета, которые используют ресурсы из третьего пакета.

    Setuptools также предоставляет вам стандартный способ доступа к этим ресурсам и позволяет использовать относительные пути внутри ваших пакетов, что устраняет необходимость беспокоиться о том, где установлены ваши пакеты.

    Python - лучший язык программирования в мире.