ImportError: не може да импортира име - Работи на едно място, но не и на друго

Така че имам следната структура на директорията:

proj/
|
---/subDirA
   |
   ---__init__.py
   ---fileA.py
|
---/subDirB
   |
   ---__init__.py
   ---fileB.py
|
---start.py

Така че това, което се опитвам да направя, е от fileB.py да импортирам функция във FileA.py. Така че опитах това:

from subDirA.fileA import funct

Когато правя това, получавам следната грешка:

ImportError: cannot import name funct

Но ако направя това вместо това:

from subDirA.fileA import *

Не получавам грешката... Може ли някой да обясни защо получавам тази грешка?

Забележка

Файлът FileA.py има само две функции, първата функция, която импортирам, когато стартирам start.py, използвайки от subDirA.fileA import funct. Получавам грешката, когато стартирам start.py и във fileB.py се опитвам да импортирам втората функция с помощта на subDirA.fileA import funct2


person vicgonzalez25    schedule 07.11.2014    source източник


Отговори (1)


Няма funct във вашия fileA модулен обект по време на импортиране. Въпреки че цикличното импортиране е най-честата причина за този проблем, възможно е също така да е печатна грешка или един от няколко други проблема.

Ако импортирате модула като цяло и посочите funct като fileA.funct, проблемът може да изчезне, защото тогава fileA.funct ще трябва да бъде наличен само по време на изпълнение, вместо по време на импортиране.

Можете също да опитате да направите print(dir(fileA)) веднага след като го импортирате, за да видите какви неща има в него в този момент. Можете също така да поставите print() непосредствено след дефиницията на funct в fileA.py, за да видите дали дефиницията се изпълнява, преди да получите тази грешка:

def funct(args):
    do_stuff()
print('funct() declared!')

Ако се опитвате да изпълните fileB.py самостоятелно, не бихте очаквали тези импортирания да работят, защото работната директория не е proj. Работната директория трябва да е proj, за да могат тези импортирания да бъдат разрешени правилно. Очевидно обаче това не е проблемът тук или няма да можете да направите звезден импорт.

person Kevin    schedule 07.11.2014
comment
Вижте въпросите с ЧЗВ за Python тук и тук, както и куп въпроси относно SO относно кръговото импортиране. В този случай най-простото решение, стига да не извиквате funct като част от вашия код от най-високо ниво, е просто да from subDirA import fileA и да използвате fileA.funct. - person abarnert; 08.11.2014
comment
Благодаря Кевин, в този случай fileB импортира функция във fileA, а start.py импортира втора функция от fileA. fileA не импортира fileB. Това същият проблем ли е? и ако е, как може да се подобри. - person vicgonzalez25; 08.11.2014
comment
@vic: А, погрешно изтълкувах въпроса ви. Ще пренапиша отговора след малко, така че връзките на abarnert вероятно няма да имат смисъл след това. - person Kevin; 08.11.2014
comment
@Kevin опита да импортира модула като цяло и не работи. Но ако премахна директорията SubDirA и преместя fileA.py в директорията от най-високо ниво, успях да го импортирам в start.py и fileB.py.. - person vicgonzalez25; 08.11.2014