2014-09-28 1 views
0

내 프로젝트 중 하나에서 "config", "source", "library"및 "modules"의 하위 디렉토리가있는 기본 디렉토리 (Directory_XYZ)가 있습니다. 네 명 모두는 서로 대화 할 파이썬 모듈을 가지고 있습니다. 4 개의 하위 디렉토리 모두에 빈 __init__.py을 넣었습니다. 그러나 여전히 일부 모듈은 서로 숨겨져 있습니다. 어떤 도움을 주셔서 감사합니다.init.py에서 숨겨진 파이썬 모듈

나는 모든 하위 디렉토리 아래의 모든 파이썬 모듈에서 sys 경로를 이와 같이 설정합니다.

lib_path = os.path.abspath('../modules') 
lib_path1 = os.path.abspath('../source') 
lib_path2 = os.path.abspath('../library') 
lib_path3 = os.path.abspath('../config') 
sys.path.append(lib_path) 
sys.path.append(lib_path1) 
sys.path.append(lib_path2) 
sys.path.append(lib_path3) 

"source"하위 디렉토리의 PQR.py에있는 "modules"하위 디렉토리에서 ABC.py를 가져올 때 숨겨집니다.

PQR.py는 sys 경로 코드와 그 아래의 가져 오기 코드를 가지고 있습니다.

내가 잘못 했습니까?

+0

'ABC'와 'XYZ'의 관계는 무엇입니까? – Yoel

+0

ABC와 XYZ는 differnt 디렉토리에서 2 개의 다른 파이썬 모듈입니다. ABC에 정의 된 일부 기능은 XYZ에서 사용합니다. 따라서 ABC를 XYZ로 가져와야합니다. –

답변

0

빈 파일의 이름은 __init__.py이어야합니다. 시도해도 문제가 해결되지 않으면 댓글을 남겨주세요.

+0

고마워요, 빈 파일의 이름은 이미 __init__.py입니다. –

+0

그것은 '__init __. py' 여야합니다. – hd1

0

우선 지정된 파일명이 Python이고 실제로 가져올 수있는 패키지의 이름은 __init__.py이고 init.py이 아니라는 점에 유의하십시오. 즉, .py 접미사가 붙지 않고 앞에 2 개의 밑줄과 2 개의 밑줄이있는 __init__.py입니다.

는 지금, 당신의 문제를 해결하기 위해, 당신이해야 할 모든 (XYZ가 현재 디렉토리에있는 경우 필요 없음) XYZsys.path에 추가하고, 그것도 아래 빈 __init__.py 파일을 배치하는 것입니다. XYZ 아래에있는 4 개의 패키지에는 정확하게 수행 한대로 빈 __init__.py 파일이 있어야하지만 sys.path에 경로를 추가 할 필요가 없습니다. 그런 다음

다음과 같은 방식으로 서로 내에서 모듈에 액세스 할 수 있습니다 : 당신이 패키지를 from package import *로 가져올 때 특정 모듈이 자동으로 가져올 수하려면

from XYZ.modules import <specific-module> 
from XYZ.source import <specific-module> 

, 당신은해야 다음과 같은 방법으로, 원하는 모듈의 이름이 포함 된 목록으로 __all__를 정의하는 해당 패키지의 __init__.py 파일을 업데이트 :

__all__ = ["<specific-module-1>", "<specific-module-2>"] 

을 그가 바로 packag를 가져 오기 완료되면 e를 포함하고 있으며 지정된 모듈을 가져옵니다.

__all__ = ['X'] 

다음 문 from XYZ.modules import * 자동 수입 'X'도하고 X로 가져 오기 모듈의 네임 스페이스에서 사용할 수 있도록 예를 들어, modules 디렉토리는 모듈 XY 및 정의하는 __init__.py 파일을 포함합니다.

Python's tutorial regarding modules and packagesPython's documentation on the import statement을 읽어 보시기 바랍니다.
This blog post 또한 흥미로운 읽을 거리입니다.

+0

Yoel! 그러나 나는 어떤 것을 이해하지 못했습니다. ABC.py는 파이썬 파일이고 "modules"는 상주하는 디렉토리입니다. 모듈에서 가져온 것이 아니어야합니다 .ABC import *? –

+0

나는 이미 "모듈"을 내 경로에 추가했고 __init__.py도 가지고 있기 때문에 "ABC import *에서"할 때 ABC.py와 그 아래 모든 함수를 볼 수 있어야한다고 생각했습니다. 나는 또한 "modules.ABC 가져 오기 *"시도했지만 오류가 "ImportError : modules.ABC라는 모듈 없음" –

+0

내 업데이트 된 답변을 참조하십시오. 'XYZ'가'sys.path'에 있는지 또는 현재 디렉토리인지 확인해야합니다. 그런 경우에는'XYZ.modules import ABC' 또는'XYZ.modules.ABC import *'에서 수행 할 수 있어야합니다. – Yoel