2017-09-12 3 views
0

안녕하세요 저는 python에 익숙하지 않아 제가 만든 프로그램 구조에 문제가 있다고 생각합니다.ImportErrors를 해결하기위한 구조에 대한 조언

이것은 내가 생각한 구조의 추출물입니다.

. 
└── asd 
    ├── asd.py 
    ├── __init__.py 
    ├── Framework 
    │   ├── importer.py 
    │   └── __init__.py 
    ├── Library 
    │   ├── libraryManager.py 
    │   └── __init__.py 

실제로 asd에는 더 많은 패키지가 있습니다. asd.py은 '기본'을 의미합니다. 다른 패키지에 포함 된 여러 클래스의 많은 객체를 인스턴스화합니다. 예를 들어 여러 라이브러리 객체가 있습니다. 임포터는 라이브러리 파일을 가져올 수 있습니다 (뿐만 아니라).

내 주요 결함은 다음과 같습니다. asd의 서로 다른 인스턴스에 액세스하기 위해 다른 패키지 내의 클래스를 사용하려면 매개 변수로 기본 asd에 대한 참조를 얻습니다.

asd.py :

from asd.Framework.importer import importer 
from asd.Library.libraryManager import libraryManager 
class asd(object): 

    def __init__(self): 
     # instantiate several objects 
     self.nodeLibMng = libraryManager("DbNodeLibrary.txt") 
     self.importer = importer(self) 

importer.py :

ImportError: No module named 'asd.Framework'; 'asd' is not a package 
: 이제 나는 다음과 같은 오류를 얻을 asd.py를 실행하려면

from asd.asd import asd 
class importer(object): 

    def __init__(self, asdRef : asd): 
     self.asdRef = asdRef 

    def importNode (self,item): 
     # The following line shows why I want this reference construct. 
     self.asdRef.nodeLibMng.appendItemToLibraryDB(item) 

사람들은 문제의 파일입니다

importer.py에서 테스트 코드를 실행하는 경우 이 오류를 얻을 : ImportError: Cannot import name X 같은

ImportError: cannot import name 'asd' 

다른 주제 내가 원형 따라 수입을하는 것이 좋습니다.

어떻게 해결할 수 있습니까?하지만 모든 클래스가 asd의 인스턴스와 통신 할 수있는 동작을 유지합니까?

EDIT 0 : 나는 동일한 문제가 사람을 위해

if __name__ == '__main__': 
    asd=asd() 
+1

당신은 당신의 경로에'asd' 아닌 * 상위 디렉토리의 *을'asd' 디렉토리가 있습니다. 따라서 'asd.py'는 디렉토리가 아닌 최상위 모듈로 발견됩니다. –

+0

'asd.py'를 스크립트로 사용하고 있습니까? 그렇다면 그렇게하지 마십시오. 패키지 내의 단일 파일을 스크립트로 실행할 수 없으므로 경로의 최상위 디렉토리가됩니다. 스크립트 * 외부 * 패키지를 넣거나'python -m' 스위치를 사용하여 모듈을 대신 스크립트로 실행하십시오 ('__main __. py' 모듈을 가진 패키지는 그 메소드를 사용하여 실행될 수 있습니다). –

+0

여기에 "asd"라고 불리는 것들이 너무 많습니다. –

답변

0

을 추가하여 asd.py 또는 importer.py을 시작 해요 : 단순히 기준과 신뢰의 입력 타입의 사양을 포기을 나 자신과 다른 사람들이 올바른 참조를 제공 할 수 있도록 또한 try: except: 블록에있는 참조에 대한 모든 액세스를 래핑했습니다. 따라서 위의 예에서

:

class importer(object): 
    # compare to the previous def __init__(self, asdRef : asd): 
    def __init__(self, asdRef): 
     self.asdRef = asdRef 

    def importNode (self,item): 
     # The following line shows why I want this reference construct. 
     try: 
      self.asdRef.nodeLibMng.appendItemToLibraryDB(item) 
     except: 
      raise