Относительные пути к файлам в пакетах Python - PullRequest
15 голосов
/ 18 июня 2009

Как мне ссылаться на файл относительно каталога пакета?

Моя структура каталогов:

    /foo
     package1/
      resources/
      __init__.py
     package2/
      resources/
      __init__.py
     script.py

script.py импортирует пакеты package1 и package2. Хотя пакеты могут быть импортированы любым другим скриптом в системе. Как мне ссылаться на ресурсы, скажем, package1, чтобы убедиться, что они будут работать в случае, если os.path.curdir произвольно?

Ответы [ 4 ]

16 голосов
/ 18 июня 2009

Если вы хотите сослаться на файлы из папки foo/package1/resources, вам следует использовать переменную __file__ модуля. Внутри foo/package1/__init__.py:

from os import path
resources_dir = path.join(path.dirname(__file__), 'resources')
6 голосов
/ 05 октября 2016

Простой / безопасный способ сделать это - использовать метод resource_filename из pkg_resources (который распространяется с setuptools ) примерно так:

from pkg_resources import resource_filename
filepath = resource_filename('package1', 'resources/thefile')

Или, если вы реализуете это внутри package1/___init___.py:

from pkg_resources import resource_filename
filepath = resource_filename(__name__, 'resources/thefile')

Это дает вам чистое решение, которое также (если я не ошибаюсь) безопасно zip.

4 голосов
/ 18 июня 2009

Вы можете быть zip-safe и в то же время использовать удобный удобный API, если используете twisted.python.modules .

Например, если у меня есть data.txt с некоторым текстом в нем, и это sample.py в одном каталоге:

from twisted.python.modules import getModule
moduleDirectory = getModule(__name__).filePath.parent()
print repr(moduleDirectory.child("data.txt").open().read())

, тогда импорт sample сделает это:

>>> import sample
'Hello, data!\n'
>>>

Если ваш модуль находится в обычном каталоге, getModule(__name__).filePath будет FilePath ; если он находится в zip-файле, это будет ZipPath , который поддерживает большинство, но не все, одинаковых API.

0 голосов
/ 18 июня 2009

Это плохая идея, потому что, если ваш пакет был установлен как zip egg, ресурсы могут быть недоступны.

Если вы используете setuptool, не забудьте добавить zip_safe = False в конфигурацию setup.py.

...