2017-10-07 8 views
-1

나는 어떤 언어가 다른 소스 파일을 가져올 정도로 간단한 일에서 파이썬만큼 두통을 일으키는 생각하지 않습니다. 그래서 여기에 질문 : 내 모듈 가져 오기가 코드 실행 방법에 의존해야합니까?파이썬 모듈 가져 오기는 코드 실행 방법에 따라 달라 집니까?

./__init__.py 
./config.py 
./kmer 
./kmer/__init__.py 
./kmer/__main__.py 
./kmer/__pycache__ 
./kmer/__pycache__/__init__.cpython-36.pyc 
./kmer/__pycache__/__main__.cpython-36.pyc 
./kmer/__pycache__/bed.cpython-36.pyc 
./kmer/__pycache__/config.cpython-36.pyc 
./kmer/__pycache__/reference.cpython-36.pyc 
./kmer/__pycache__/sets.cpython-36.pyc 
./kmer/bed.py 
./kmer/config.py 
./kmer/reference.py 
./kmer/sets.py 

내가 kmer 패키지 안에 다른 모듈에서 khmer 내부 모듈을 가져 오려는 :

나는 다음과 같은 디렉토리 구조를 가지고있다. 단순한?

그래서 나는 bed.py의에서이 추가 : 나는 kmer 디렉토리에서 python bed.py 을 실행하면

import reference 
import config 
import sets 

지금은 일이 잘 작동합니다. 또한 하나의 디렉토리로 돌아와서 python kmer/bed.py으로 전화하면 문제가 없습니다. 파이썬이 주어진 파일에 상대적으로 임포트 된 모듈을 검색하는 것처럼 보입니다.

kmer 디렉토리의 python -m bed 디렉토리를 다시 실행하면 하나의 디렉토리로 돌아가서 을 실행하면 모듈 오류가 발생합니다. 파이썬이 인터프리터의 현재 디렉토리 안에있는 모듈을 찾아 파일 시스템의 어느 곳에 나있을 수있는 것처럼 보입니다. 그래서 상대적인 가져 오기가 작동해서는 안됩니다.

이것은 기본적으로 수입이 코드가 어떤 의미가없는 실행하는 것입니다 방법에 의존한다는 것을 의미한다. 이것이 어떻게 작동해야하는지에 대한 약간의 설명에 감사드립니다.

this 질문에 대한 답변을 포함하여 많은 리소스를 살펴 보았지만 매우 자세한 내용 (실제로 가장 잘 나온 설명 중 하나)은 내 문제를 해결하지 못하고 적절한 예를 제공하지 않지만 .

업데이트 :이 질문은 코드를 실행하는 다른 방법은의 중복으로 표시된 것보다, 수입에 미치는 영향을보다 정확하게 상대 수입의 다른 측면에 더 초점을 맞추고 생각합니다. 그 이유는 내가 처음에 다른 질문을 언급했기 때문입니다. 그러므로 나는 이것이 중복되어야한다고 생각하지 않는다. 패키지를 작성할 때

+0

링크 된 질문이 문제를 해결하지 못하는 이유를 설명해야합니다. 문제가 해결되는 것처럼 보입니다. – user2357112

+0

@ user2357112이 질문을 다른 점은 데이비스의 대답이 지적한 패키지 및 스크립트 의미 부분의 혼동입니다. 나는 연결된 질문과 이해를 자연스럽게 주관적으로 이해하지 못했습니다. – DarthPaghius

답변

1

, 당신은 지속적으로 패키지로 처리해야합니다. 첫째, 패키지 내에서 상대 가져 오기를 사용하는 것입니다. from . import referencebed.py에 입력하십시오.

그것은 또한 항상 동일에 액세스하는 방법에 대한 해답을 의미 들어있는 디렉토리 kmersys.path 위에 (보통 PYTHONPATH를 통해)했습니다. 이 을해야하기 때문에 이러한 현상이 스크립트와 같은 패키지에 일부 모듈을 실행하는 경우에도 마찬가지입니다.

불행하게도,이 스크립트로 패키지 내부에 모듈을 실행하는 나쁜 생각 : 모듈의 파일이 여전히 적절한 이름으로 다시 를 가져올 수 자격 (보다는 __main__ 처음 사용). 유일한 강력한 솔루션 공용 모듈 이름의 과부하를 방지하는 __main__.py를 작성하고 스크립트와 패키지를 실행하는 것입니다.

마지막으로, Python의 "기능"에주의를 기울이지 말고 스크립트의 디렉토리를 sys.path에 두십시오. sys.path에서 유용 할 수있는 스크립트는 반드시 모듈이되어야하므로 (이름이 식별자가 아닌 것처럼 만드는 트릭을 제외하고) 이름 충돌에 신경 쓰지 않는 장난감 문제 이외에는 쓸모가 없습니다. 또한, 다른 곳에 설치된 스크립트에서 라이브러리를 사용할 수있게하려면 어쨌든 sys.path에 접속해야합니다.

+0

'-m' 플래그를 사용하여 패키지 내부의 모듈 중 하나를 실행하려해도'SystemError : Parent module ''로드되지 않음 '오류가 발생합니다. 네가 한 말과 모순되지 않니? – DarthPaghius

+0

@Parsoa : 어떤 명령 행을 사용 했습니까? 전체 예외 메시지였습니까? –