2015-12-03 3 views
0

У меня есть два отдельных модуля, которые я пытаюсь импортировать определенные функции друг в друга, однако я продолжаю получать ошибку импорта для функций, которые определены в самом модуле helperModule.py. Что я делаю не так?Проблема с импортом определенных функций из модулей

helperModule.py

from utilsModule import startProcess 

def getCfgStr(): 
    pass 

def getCfgBool(): 
    pass 

def doSomethingElse(): 
    startProcess() 

utilsModule.py

from helperModule import getCfgStr, getCfgBool 

def startProcess(): 
    a = getCfgStr() 
    b = getCfgBool() 
    pass 
+1

У вас есть круглый импорт. A не может импортировать из B, который импортирует из A. Вам нужно реорганизовать. –

+2

Я в замешательстве. Я * думал * проблема была круговой ошибкой импорта, но вы утверждаете, что ваш первый файл называется 'helperModule.py', но ваш второй импорт из модуля, называемого' utilshelperModule'. Так это случай, когда круговая ошибка импорта скрыта опечаткой, или вы неправильно сообщаете имя своих файлов? (Так как вы только описали ошибку вместо копирования вставки фактической ошибки, трудно различить их.) – DSM

+0

@DSM То же самое (отсюда «похоже, соответствует» в моем ответе), но я пошел вперед и все равно ответил. Я думаю, если окажется, что я ошибаюсь, я получу заслуженные понижения, чтобы показать это. –

ответ

2

Вы показываете:

from utilsModule import startProcess 

, который соответствует вашему utilsModule.py где startProcess функция определена. В верхней части этого файла, вы показываете:

from helperModule import getCfgStr, getCfgBool 

, который соответствует вашему helperModule.py, где определены эти две функции.

Это круговой импорт. utilsModule импорт из utilshelperModule, который импортирует из utilsModule ... вы видите, куда я иду.

Вы должны реорганизовать и импортировать их из третьего файла, чтобы предотвратить это.

0

Вы можете либо иметь функции нужны функции, необходимые им (во время выполнения, а не на время загрузки):

def getCfgStr(): 
    pass 

def getCfgBool(): 
    pass 

def doSomethingElse(): 
    from utilsModule import startProcess 
    startProcess() 

def startProcess(): 
    from helperModule import getCfgStr, getCfgBool 
    a = getCfgStr() 
    b = getCfgBool() 

Или по крайней мере, могли бы сделать импорт как можно позже:

def getCfgStr(): 
    pass 

def getCfgBool(): 
    pass 

def doSomethingElse(): 
    startProcess() 

from utilsModule import startProcess 

и

def startProcess(): 
    a = getCfgStr() 
    b = getCfgBool() 

from helperModule import getCfgStr, getCfgBool 

Здесь мы сначала положить функции в существование, а затем обеспечить их глобальное пространство имен с функциями из другого модуля.

Таким образом, циклический импорт, вероятно, будет работать, потому что импорт происходит поздно.

Это все равно будет работать, если ни одна из функций не будет использована во время импорта.

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