Я використовую Python 2.5.
Це моє дерево папок:
ptdraft/
nib.py
simulations/
life/
life.py
(У мене також є __init__.py
в кожній папці, опущений тут для зручності читання)
Як імпортувати модуль nib
з модуля life
? Я сподіваюся, що це можна зробити, не втручаючись у sys.path.
Примітка: Основний модуль, що виконується, знаходиться у теці ptdraft
.
Можна використовувати відносний імпорт (python >= 2.5):
from ... import nib
(Що нового в Python 2.5) PEP 328: Абсолютний та відносний імпорт.
ПРАВКА: додано ще одну крапку '.' для переходу на два пакети вгору
Схоже, що проблема не пов'язана з тим, що модуль знаходиться в батьківському каталозі або щось подібне.
Потрібно додати каталог, в якому міститься ptdraft
, в PYTHONPATH
Ви сказали, що import nib
у вас працював, це, ймовірно, означає, що ви додали в PYTHONPATH сам ptdraft
(а не його батька).
Якщо додавання вашої папки з модулями до PYTHONPATH не спрацювало, ви можете змінити список sys.path у вашій програмі, де інтерпретатор Python шукає модулі для імпорту, як зазначено в python documentation:
Коли імпортується модуль з ім'ям spam, інтерпретатор спочатку шукає вбудований модуль з таким ім'ям. Якщо його не знайдено, він шукає файл з ім'ям spam.py у списку каталогів, заданому змінною sys.path. sys.path ініціалізується з цих місць:
- каталог, що містить вхідний скрипт (або поточний каталог). PYTHONPATH (список імен каталогів, з тим же синтаксисом, що і змінна оболонки PATH).
- залежне від інсталяції значення за замовчуванням.
Після ініціалізації Python-програми можуть змінювати sys.path. Каталог, що містить виконуваний скрипт, поміщається на початок шляху пошуку, випереджаючи стандартний шлях до бібліотеки. Це означає, що замість однойменних модулів в каталозі бібліотек будуть завантажені скрипти з цього каталогу. Це є помилкою, якщо тільки заміна не передбачена.
Знаючи це, ви можете зробити в своїй програмі наступне:
import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')
# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft