Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

proj/setup.py
proj/proj/__init__.py
proj/proj/code.py
proj/proj/resources/__init__.py
proj/proj/resources/images/__init__.py
proj/proj/resources/images/pic1.png
proj/proj/resources/images/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 не будет знать о пакете proj. Поэтому такие вещи, как proj.resources, не будут разрешены.

Ответ 2

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

c:\temp\topp        (top-level package)
c:\temp\topp\sub1   (subpackage 1)
c:\temp\topp\sub2   (subpackage 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\work>topapp
Traceback (most recent call last):
  File "C:\temp\work\topapp.py", line 1, in 
    import topp
ImportError: No module named topp

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

C:\temp\work>set PYTHONPATH=c:\temp

C:\temp\work>topapp
c:\temp\topp\resources
c:\temp\topp\sub1\resources
c:\temp\topp\sub2\resources

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

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

Ответ 3

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

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

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

Яйца и развертывание сборки в Python - часть 3

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

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

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