2013-04-14 3 views
0

Таким образом, в файле обув я ввожу модули:Python: импортировать модуль, который импортирует модуль

import lib.helper_functions 
import lib.config 

И в helper_functions.py, у меня есть:

import config 

Когда я бегу основной функция Foo Я получаю ImportError

EDIT: Вот структура файлов у меня есть

foo.py 
lib/ 
    config.py 
    helper_functions.py 

Результаты ошибок от импорта конфигурации в helper_functions

Traceback (most recent call last): 
    File "C:\Python33\foo.py", line 1, in <module> 
    import lib.helper_functions 
    File "C:\Python33\lib\helper_functions.py", line 1, in <module> 
    import config 
ImportError: No module named 'config' 

Так вот: когда я бегу foo.py переводчика жалуется на импорт заявления helper_functions. Однако, когда я запускаю главную функцию helper_functions, такой ошибки не возникает.

+3

Вам необходимо импортировать модули в каждый другой файл, который их использует; каждый модуль получает свое собственное пространство имен и не наследует имена в импортируемых им файлах (если вы не используете синтаксис 'from foo import *', который следует избегать, поскольку это приводит к ужасным, трудно диагностированным ошибкам) ​​ – geoffspear

+0

Если вы «Я говорю, что мне нужно импортировать конфиг в foo, я уже делаю это (конечно, в foo я должен ссылаться на него как на lib.config). Это не помогает с NameError. –

+1

Я не вижу * NameError * в вашей трассе. Я вижу «ImportError», это очень * отличная * ошибка. –

ответ

5

Вам необходимо импортировать config, используя абсолютный импорт. Либо используйте:

from lib import config 

или использование:

from . import config 

Python 3 поддерживает только абсолютный импорт; в заявлении import config импортируется только модуль config.

+0

Но то, что бросает ошибку, не импортирует lib.config в foo. Скорее, он импортирует config в helper_functions. Однако, с любопытством, эта ошибка возникает только при запуске foo.main не при запуске helper_functions.main. Я редактировал вопрос, чтобы показать текст ошибки. –

+0

@AnasElghafari: ах, прошу прощения, я не правильно прочитал ваш вопрос.Если бы вы добавили трассировку для начала, это было бы более ясным. –

+0

@AnasElghafari: рассмотрел вашу актуальную проблему в обновленном ответе. –

0

В python каждый модуль имеет собственное пространство имен. Когда вы импортируете другой модуль, вы фактически импортируете его имя.

Имя «config» существует в модуле helper_functions, потому что вы импортировали его там. Импорт helper_functions в foo приводит только имя «helper_function» в пространство имен foo, ничего другого.

Вы могли бы на самом деле относитесь к имени «конфигурации» в foo.py с текущим импортом, делая что-то вроде:

lib.helper_functions.config 

Но питона всегда лучше быть явными, а не подразумеваются. Поэтому импорт конфигурации в foo.py был бы лучшим способом для продолжения.

#file foo.py 
import lib.helper_functions 
import config 
+0

ну, конфиг в lib. Я импортирую его в foo.py в любом случае (import lib.config). Но при запуске foo.main интерпретатор жалуется на инструкции импорта в helper_functions.py. даже если я запускаю helper_functions.main, такой ошибки не возникает. В любом случае, я отредактировал вопрос, чтобы добавить сообщение об ошибке –

+0

А, теперь я вижу ваше редактирование. Я не мог воспроизвести его, потому что я использую Python2.7. Это вызывает ошибку только в Python3. Причина была объяснена @Martijn Pieters в его ответе. – jujaro

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