Python: импортиране на модул, който импортира модул

Така че във файл foo импортирам модули:

import lib.helper_functions
import lib.config

И в helper_functions.py имам:

import config

Когато стартирам основната функция на foo, получавам ImportError

РЕДАКТИРАНЕ: Ето структурата на файловете, които имам

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. Но когато стартирам main of helper_functions, не се появява такава грешка.


person Anas Elghafari    schedule 14.04.2013    source източник
comment
Трябва да импортирате модули във всеки друг файл, който ги използва; всеки модул получава свое собствено пространство от имена и не наследява имената във файловете, които импортира (освен ако не използвате синтаксиса from foo import *, който трябва да избягвате, тъй като води до ужасни, трудни за диагностициране грешки)   -  person Wooble    schedule 15.04.2013
comment
Ако казвате, че трябва да импортирам config във foo, аз вече го правя (разбира се във foo трябва да го наричам lib.config). Това не помага с NameError.   -  person Anas Elghafari    schedule 15.04.2013
comment
Не виждам NameError във вашето проследяване. Виждам ImportError, това е много различна грешка.   -  person Martijn Pieters    schedule 15.04.2013
comment
Благодаря за бележката, всъщност преработих оригиналната настройка минимално, преди да добавя скорошната редакция. Така че в моя код имаше NameError, но това идваше от някъде другаде. Предполагам, че трябва да го редактирам, тъй като не е част от този конкретен проблем.   -  person Anas Elghafari    schedule 15.04.2013


Отговори (2)


Трябва да импортирате config с помощта на абсолютно импортиране. Използвайте или:

from lib import config

или използвайте:

from . import config

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

person Martijn Pieters    schedule 14.04.2013
comment
Но това, което хвърля грешката, не е импортирането на lib.config в foo. По-скоро импортира конфигурация в helper_functions. Въпреки това, любопитно, тази грешка е само когато се изпълнява foo.main, а не когато се изпълнява helper_functions.main. Редактирах въпроса, за да покажа текста на грешката. - person Anas Elghafari; 15.04.2013
comment
@AnasElgfari: ах, извинявам се, не прочетох въпроса ви правилно. Ако бяхте добавили обратното проследяване, за да започнете, това щеше да е по-ясно. - person Martijn Pieters; 15.04.2013
comment
@AnasElghafari: Обърнах внимание на действителния ви проблем в актуализиран отговор. - person Martijn Pieters; 15.04.2013
comment
@Marijn: Да, благодаря. Промених оператора за импортиране в helper_functions, така че да гласи: от конфигурация за импортиране на библиотека. И това го оправи. - person Anas Elghafari; 15.04.2013
comment
ЗАБЕЛЕЖКА: Въпреки че това решава проблема с foo (т.е. foo.py работи без грешка), вече не мога да стартирам main на helper_functions (използвам това за тестване), тъй като интерпретаторът ще се оплаче от from lib import config казва, че няма модул с име lib. Поне при мен беше така. Мисля, че променливата PYTHONPATH може да играе роля. - person Anas Elghafari; 16.04.2013
comment
Същото нещо: ImportError: No module named lib и ValueError: Attempted relative import in non-package - person Luis A. Florit; 25.01.2014
comment
Можете да използвате относителни импортирания само в рамките на пакет (директория на вашия път с __init__.py в нея), а не между модули от най-високо ниво. - person Martijn Pieters; 25.01.2014

В Python всеки модул има свое собствено пространство от имена. Когато импортирате друг модул, вие всъщност импортирате само неговото име.

Името "config" съществува в модула helper_functions, защото сте го импортирали там. Импортирането на helper_functions в foo пренася само името "helper_function" в пространството от имена на foo, нищо друго.

Всъщност можете да се обърнете към името "config" във foo.py с текущите си импортирания, като направите нещо като:

lib.helper_functions.config

Но в Python винаги е по-добре да бъдете изрични, отколкото имплицитни. Така че импортирането на конфигурация във foo.py би било най-добрият начин да продължите.

#file foo.py
import lib.helper_functions
import config
person jujaro    schedule 14.04.2013
comment
добре, конфигурацията е в lib. Така или иначе го импортирам във foo.py (import lib.config). Но когато стартира foo.main, интерпретаторът се оплаква от изразите за импортиране в helper_functions.py. въпреки че когато стартирам helper_functions.main, не възниква такава грешка. Както и да е, редактирах въпроса, за да добавя съобщението за грешка - person Anas Elghafari; 15.04.2013
comment
А, сега виждам редакцията ти. Не можах да го възпроизведа, защото използвам Python2.7. Това причинява грешка само в Python3. Причината е обяснена от @Martijn Pieters в неговия отговор. - person jujaro; 20.04.2013