Пакеты 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.К сожалению.