Ответ 1
Пакеты Python очень просты: пакет представляет собой любой каталог под любой записью в sys.path с файлом __init__.py
. Тем не менее, модуль считается включенным только в пакет, если он импортируется через относительный импорт, такой как import package.module
или from package import module
. Обратите внимание, что это означает, что в общем случае кто-то должен установить sys.path, чтобы содержать каталоги над любым пакетом, который вы хотите импортировать, через PYTHONPATH
или иначе.
Первичная морщина заключается в том, что основные модули (те, которые запускаются непосредственно из командной строки) всегда __main__
независимо от их местоположения. Поэтому им приходится делать абсолютный импорт, и либо полагаться на PYTHONPATH, либо настраивать сами sys.path.
В вашем случае я бы рекомендовал либо иметь небольшой Python script, который запускает ваши примеры после настройки правильного пути. Скажем, вы поместили его в каталог верхнего уровня:
#!/usr/bin/env python
import sys
import os.path
sys.path.append(os.path.dirname(__file__))
example = __import__("examples", globals(), locals(), sys.argv[1])
Тогда ваш пример может сделать "import module".
В качестве альтернативы, если module.py
также должен быть в пакете, добавьте PARENT вашего "каталога верхнего уровня" в sys.path, а затем используйте синтаксис from .. import module
в ваших примерных модулях. Кроме того, измените первый параметр на __import__
в обертке на "tldname.examples", где tldname - это имя вашего каталога верхнего уровня.
Если вы не хотите полагаться на модуль "примерный бегун", для каждого примера нужен шаблон sys.path, или вам нужен параметр PYTHONPATH. К сожалению.