Расположение каталогов проектов и пакетов Python - PullRequest
11 голосов
/ 03 февраля 2011

Я создал проект на python, и мне интересно, как пакеты работают на python.

Вот мой макет каталога:

top-level dir
  \ tests
    __init__.py 
  \ examples
    __init__.py
    example.py
module.py

Как мне добавить модуль.py в мой модуль example.py. Я знаю, что могу установить PYTHONPATH в каталог верхнего уровня, но это не похоже на хорошее решение. Вот как pydev обходит эту проблему, но я бы хотел, чтобы решение не требовало обновления переменных среды.

Я мог бы поместить что-нибудь вверху example.py для обновления sys.path, например так:

from os import path
import sys

sys.path.append( path.dirname(path.abspath(path.dirname(__file__))) )

Я тоже не думаю, что это подходящее решение.

Я чувствую, что мне не хватает какой-то базовой части пакетов Python. Я тестирую это на Python 2.6. Если понадобятся дальнейшие разъяснения, пожалуйста, дайте мне знать.

Ответы [ 2 ]

9 голосов
/ 03 февраля 2011

Пакеты Python очень просты: пакет - это любой каталог в любой записи в sys.path, в котором есть файл __init__.py.Тем не менее, модуль считается IN в пакете, только если он импортирован через относительный импорт, такой как import package.module или from package import module.Обратите внимание, что это означает, что в общем случае кто-то должен настроить sys.path так, чтобы он содержал каталоги над любым пакетом, который вы хотите импортировать, с помощью PYTHONPATH или иным образом.

ПервичныйОсновным недостатком является то, что основные модули (запускаемые непосредственно из командной строки) всегда __main__ независимо от их местоположения.Поэтому они должны выполнять абсолютный импорт и либо полагаться на настройку PYTHONPATH, либо самим munge sys.path.

В вашем случае, я бы порекомендовал либо иметь небольшой скрипт Python, который запускает ваши примеры после установкивверх по правильному пути.Допустим, вы поместили его в каталог верхнего уровня:

#!/usr/bin/env python
import sys
import os.path

sys.path.append(os.path.dirname(__file__))
example = __import__("examples", globals(), locals(), sys.argv[1])

Тогда ваш пример может выполнить «модуль импорта».

В качестве альтернативы, если module.py подразумевается также в пакете,добавьте PARENT вашей «директории верхнего уровня» в sys.path, а затем используйте синтаксис from .. import module в ваших примерных модулях.Также измените первый параметр на __import__ в оболочке на «tldname.examples», где tldname - это имя вашего каталога верхнего уровня.

Если вы не хотите полагаться на «пример»модуль runner ", в каждом примере требуется шаблон sys.path, или вам нужна настройка PYTHONPATH.К сожалению.

1 голос
/ 03 февраля 2011
...