При запуске питона из каталога, то этот каталог добавляются в список PYTHONPATH
так модули ввозимые из этого каталога и ниже, при условии, у вас есть __init__.py
в каждом каталоге, в том числе сверху уровня, из которого вы используете python. Смотрите здесь:
~/Development/imports $ tree . ├── __init__.py ├── mod1 │ ├── __init__.py │ ├── a.py ├── mod2 │ ├── __init__.py │ ├── b.py ├── top.py
Итак, когда мы начинаем питона из ~/Development/imports/
, мы можем получить доступ к top
mod1.a
и mod2.b
:
~/Development/imports $ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import top
>>> import mod1.a
>>> import mod2.b
>>> import sys
Но когда мы начинаем питона внутри mod1
, мы не позволили выходят за пределы mod1
до top
или до mod2
:
~/Development/imports/mod1 $ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> from .. import top
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Attempted relative import in non-package
>>> from ..mod2 import b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Attempted relative import in non-package
Относительный импорт from ..mod2 import b
работает только с модулем под модулем верхнего уровня, из которого вы начали, потому что все они неявно находятся в пути python.
Вы не можете избежать вне модуля вы начинаете с, если этот конкретный путь не добавляется PYTHONPATH
или sys.path
:
~/Development/imports/mod1 $ PYTHONPATH=../ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> import top
>>> import top.mod2.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mod2.b
>>> import sys
>>> sys.path.append('~/Development/imports/mod2/')
>>> from mod2 import b
>>>
Таким образом, вы должны убедиться, что все ваши каталогов имеют __init__.py
файл в них. Вам также необходимо убедиться, что вы запускаете python из правильного местоположения, обычно верхнего каталога. Вы не можете запустить python на полпути вниз по структуре каталогов и ожидать возврата вверх, или сбоку в другой каталог/модуль.
Вы можете добавить пути с модулями следующим образом: 'sys.path.append ('../ import')' например. – Marcin
Я тоже пробовал это, но он все еще бросает ошибку «модуль не найден». – Norghar
, пожалуйста, уточните структуру проекта. Его непонятно из вопроса, где и что вы называете своей программой. – Marcin