2015-03-04 2 views
0

Я пытаюсь импортировать модули из отдельных путей, но возвращаемая им ошибка «модуль не найден». Он импортирует модули из каталога, в который выполняется скрипт, но не будет изменять каталоги и импортировать из указанного каталога.Импорт модулей из отдельных путей в Python

print(os.getcwd()) 

Когда я запускаю это, прежде чем он бросает ошибку, что не может найти модуль, он будет выводить родительский каталог так, например, я пойду с тестов \ импорт \ модулеем.

Я побегу сценарий в \ импорта \ импортировать test_0.pyd из \ импорта \ и test_1.pyd из \ модулей (test.py и test_0 располагавшихся в \ импорт \ и test_1 находится в \ modules. Также я пробовал относительный импорт, и каждый каталог содержит init .py).

import test_0 # this would work 
from modules import test_1 # throws error that module isn't found 

Так что я выполнить команду печати и возвращается, что он пытается импортировать из теста \ и я попытался изменить каталоги, но это будет сказать, что рабочий каталог изменилось, когда я печатаю, но по-прежнему выдает что он не смог найти модуль. Любая помощь очень ценится, спасибо.

EDIT http://prntscr.com/6ch7fq - выполнение test.py http://prntscr.com/6ch80q - каталог импорта

+1

Вы можете добавить пути с модулями следующим образом: 'sys.path.append ('../ import')' например. – Marcin

+0

Я тоже пробовал это, но он все еще бросает ошибку «модуль не найден». – Norghar

+0

, пожалуйста, уточните структуру проекта. Его непонятно из вопроса, где и что вы называете своей программой. – Marcin

ответ

2

При запуске питона из каталога, то этот каталог добавляются в список PYTHONPATH так модули ввозимые из этого каталога и ниже, при условии, у вас есть __init__.py в каждом каталоге, в том числе сверху уровня, из которого вы используете python. Смотрите здесь:

~/Development/imports $ tree . ├── __init__.py ├── mod1 │   ├── __init__.py │   ├── a.py ├── mod2 │   ├── __init__.py │   ├── b.py ├── top.py

Итак, когда мы начинаем питона из ~/Development/imports/, мы можем получить доступ к topmod1.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 на полпути вниз по структуре каталогов и ожидать возврата вверх, или сбоку в другой каталог/модуль.

+0

вот что это было ничего себе. Я переместил его к корню, изменив линии импорта, и он пробовал исправление для такой проблемы с ошибкой. Haha спасибо за это, вы объяснили это хорошо, я соглашусь, как только смогу! – Norghar

0

У вас есть __init__.py файл в указанной директории модулей /? Это необходимо для того, чтобы python рассматривал его как пакет.

Заканчивать What is __init__.py for?

+0

да, я отредактировал сообщение незадолго до того, как вы сказали это, но я проверил все, и в настоящее время я получаю скриншоты, которые я буду размещать, затем – Norghar

+0

@Norghar, ваш скриншот показывает, что в каталоге ** нет ** файла '__init __. py'. –

+0

он сделал, но он был скрыт. Я забыл снять это, извините – Norghar

Смежные вопросы