2014-11-07 2 views
0

파이썬 2.6에서 다음 작업을 수행하려고합니다.순환 함수 가져 오기

my_module.py:- 
    from another_module import another_factory 

    def my_factory(name): 
     pass 

another_module.py:- 
    from my_module import my_factory 

    def another_factory(name): 
     pass 

두 폴더가 같은 폴더에 있습니다. 그것은 나에게 오류를 제공

: 코멘트에서 볼 수 있듯이

Error: cannot import name my_factory 
+0

, 당신은 첫 번째 방법을 시도 할 때 –

+0

가 오류를 표시 할 수 있습니다 프로젝트의 폴더와 모듈의 구조를 보여주십시오 또는 당신은 (https://docs.python.org/2/library/imp.html 또한 문서를 참조) load_source을 사용하기로 결정 할 수 있습니까? 그리고 당신이 어떻게이 기능을 사용하려고 시도하는지 보여주는 예입니다. – CoryKramer

+2

오류가 있습니까? 정확히 어떻게됩니까? "작동하지 않음"은 문제를 진단하는 데 필요한 정보가 아닙니다. – Carpetsmoker

답변

2

, 당신은 불가능 원의 수입을 위해 노력하고 있습니다.

모듈 A에서 모듈 B에서 무언가를 가져 오려고하면 모듈 A에서 무언가를 가져 오려고 시도하는 모듈 B를로드 할 때 (시작하기 전에) 원 가져 오기 : 필요 B와 B는 A !!를 필요로합니다! 그것은 어떻게 든 A가 A를 필요로한다고 말하는 것과 같습니다. 이것은 꽤 비논리적입니다. 예를 들어

:

# moduleA 
from moduleB import functionB 
... 

그래서 인터프리터는 다음처럼 보이는 moduleB,로드하려고 :

# moduleB 
from moduleA import functionA 
... 

그리고 B를 가져올 다시 시도하는 moduleA로 거슬러 올라간다을, 따라서 파이썬은 오류를 발생시키고 더 큰 이익을 위해 광기를 멈춘다.

종속성이 이와 같이 작동하지 않습니다. 어떤 모듈이 다른 모듈을 필요로하는지 정의하고 간단한 가져 오기 만하십시오. 귀하의 예에서는 another_modulemy_module이 필요하므로 my_module을 변경하고 another_module에 대한 종속성을 제거하십시오.

두 모듈이 실제로 서로를 필요로하는 경우 동일한 논리적 개념에 속하고 병합되어야한다는 명확한 신호입니다.

PD : 대용량 파일을 피하기 위해 논리 단위를 두 개로 나눌 수 있으며 원의 종속성을 피하기 위해로드 시간에 실행되지 않는 함수 내부에 가져 오기를 작성하면 원이 없습니다. 그러나 이것은 일반적으로 피해야 할 대상입니다.

0

실제 질문은 ... 각 파일을 모듈으로 간주합니까, 아니면 패키지의 일부입니까?

모듈패키지 외부로 가져 오기를 시도하는 것은 때로는 고통 스럽습니다. 디렉토리에 빈 __init__.py 모듈을 작성하기 만하면 패키지를 빌드해야합니다. 당신이 테 my_module.py,

def my_factory(x): 
    return x * x 

의 기능을 다음과 같은 경우는

__init__.py 
my_module.py 
another_module.py 

이있는 경우 비록, 당신은 another_module에서 my_factory() 기능에 액세스 할 수 있어야합니다.이 작성하여 평 : 당신이 __init__.py 파일/모듈이없는 경우,

from my_module import my_factory 

을하지만, 가져 오기 기능은 (어떻게 든)가 손실됩니다 만 의 sys.path를 사용합니다 다른 모듈 검색하기. 그런 다음 another_module.py 파일합니다 (수입 전에) 다음 줄을 추가 할 수 있습니다 :

sys.path.append(os.path.dirname(os.path.expanduser('.'))) 

또한 모듈을 수입하는 데 사용할 수있는 다양한 패키지를 사용할 수 있습니다 꼬마 도깨비 또는 import_file 같은 (문서 참조)