2017-02-27 6 views
1

여러 위치에서 모듈을 가져 오려고하는데 Python3의 상대 가져 오기가 비활성화 되었기 때문에이 모듈을 사용할 수 없습니다. 사용자가 package_1을 복사하여 터미널 (메인 클래스를 사용)에서 실행할 수 있도록이 작업을 수행하려고합니다. 또 다른 클래스는 웹 응용 프로그램 프론트 엔드 인 scriptb.py로 가져옵니다. 은 "package_1/run.py"수입에서 여기여러 위치에서 모듈을 가져올 때 python3 상대 가져 오기

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
------ subpackage_a/core/module1.py 
------ subpackage_a/__init__.py 
------ subpackage_a/core/__init__.py 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

: package_1.run 가져 오기 클래스 이름

: subpackage_a.core.module1 가져 오기 클래스 이름에서 여기

는 "package_2/scriptb"수입은

그러나 나는 실행할 때 나는 run.py ImportError를에서 다음과 같은 오류 얻을 scriptb.py : 없음 모듈 이름 'package_1.core'

Traceback: 
File "/directory/package_1/run.py", line 7, in <module> 
    from subpackage_a.common.exceptions import Classname 
ImportError: No module named 'subpackage_a.common' 

이것을 처리하고 ImportError 예외를 포착하고 모든 "package_a"모듈에서 두 개의 가져 오기 위치를 정의하는 더 좋은 방법이 있습니까?

또는 각 모듈에 두 번

if __name__ == '__main__': 
    from package_1 import classname 
else: 
    from .package_1 import classname 

감사

EDIT 수입을 의미하는이하는 것보다 더 나은 : 향후 참조를 위해

는 i를 다른 모듈을 가져올 서브 패키지에서이 작업을 수행했다 코어 폴더

try: 
    from package_1.core.module1 import classname: 
except ImportError: 
    from ..core.module2 import classname 

다음과 같이 작동합니다 주요 지역 : 당신이 패키지로 사용하려는 경우

if __name__ == '__main__': 
    from package_1.core.module1 import classname: 
except ImportError: 
    from .package_1.core.module2 import classname 

답변

1

모든 하위 디렉토리는 __init__.py이 있어야합니다. 다음 파일 구조를 구현하십시오. 나는이 처리의 당신의 방법은 더 나은 옵션

생각 :

-- projectfolder 
-- projectfolder/ 
-- __init__.py 
--- package_1/ 
------ __init__.py 
------ subpackage_a/ 
-----------__init__.py********** 
------ subpackage_a/core/module1.py 
-------------------core/ 
-----------------------__init__.py********** 
------ run.py 
--- package_2/ 
----- __init__.py 
-- -- scriptb.py 

편집 한 subpackage_a 폴더와 subpackage_a/코어/ 폴더로 __init__.py 파일을 추가

if __name__ == '__main__': from package_1 import classname else: from .package_1 import classname 
+0

답장을 보내 주셔서 감사합니다. 모든 패키지에는 __init__.py 파일이 있습니다. 나는 그들을 입력하는 것을 잊었을 때 게시물을 편집 할 것입니다. – budge

+0

젠장, 주 프로그램으로 호출되지 않았기 때문에 "__name__ == '__main__':"하위 패키지 안에 사용할 수 없습니다. 그것을하는 동일한 문제가있는. ImportError 예외를 잡아야한다고 가정 해 봅시다. – budge

1

글쎄, 폴더 구조와 "서브 팩" "package_1/run.py"및 "package_2/scriptb.py"의 "kage_a"실제로 "subpackage_a"는 "package_1"의 하위 패키지가 아닙니다. 현실에 맞게 프로젝트를 개선하고 "subpackage_a"를 실제 패키지로 만들고 distutils 또는 유사한 것을 사용하여 Python으로 설치할 수있게하십시오. 그렇다면 "run.py"와 "scriptb.py"는 상대적인 import hacks로 돌아 가지 않고도 사용할 수 있습니다.