2015-01-02 1 views
7

Anaconda 2.1.0 배포본을 통해 scipy 및 numpy를 사용하고 있습니다. 나는 Spyder를 파이썬 IDE로 사용한다. 내가 import scipy as sp을 실행하면numpy 및 Scipy 패키지의 모듈/하위 패키지 가져 오기 차이점

, 나는 import numpy as np를 실행할 때, 내가 같은 모든 하위 패키지에 액세스 할 수 있어요, 그러나 sp.

을 통해 등 클러스터 최적화, linalg, 같은 서브 패키지를 액세스 할 수 없습니다 linalg, random, matrixlib, 다항식, 테스팅 등 np.

두 가지 가져 오기가 다른 방식으로 작동하는 이유가 있습니까? import scipy as sp이 모든 scipy 하위 패키지를 sp의 네임 스페이스로 가져 오지 않는 이유는 무엇입니까?

+0

이것은 실제로 흥미로운 질문입니다. 재미있는 점은 :'import spipy as sp'가'sp.optimize'를 입력하면 오류가 발생합니다. 그러나'scipy import optimize'에서 갑자기'sp.optimize'는 더 이상 에러를주지 않을 것입니다. 이 문제는 아나콘다와 관련이 없습니다. – cel

+2

@cel,'scipy import optimize'를 입력하면 인터프리터가 이미 메인 패키지'scipy '를로드했음을 알게되고 이미 서브 모듈'optimize'를 가져 오기 때문에 에러가 발생하지 않게됩니다 로드 된 모듈. 식별자'sp'는 이전과 같은 모듈을 가리키고 있습니다. 이제는 'updated'입니다. 따라서 식별자를 통해 서브 모듈'optimize'에 액세스 할 수 있습니다. – gg349

+0

@ gg349 오, 그건 의미가 있습니다 - 몰랐습니다 :) – cel

답변

5

다른 가져 오기 동작이 발생할 가능성은 파이썬 언어의 설계에 따라 발생합니다.

기본적으로 모듈 (*)의 import 문은 하위 모듈이 아닌 기본 모듈 만 가져옵니다. 주 모듈은 (numpy의 경우와 같이) 또는 서브 모듈의 일부 또는 전체를 가져 오지 않을 수도 있습니다 (예 : scipy).

그 이유는 scipy입니다. 대부분의 경우 scipy 패키지의 서브 모듈이 하나만 필요합니다. 이 기본 동작은 코드에 불필요한 하위 모듈로드시 인터프리터를 정지시키지 않습니다.

편집 : 기본적으로 모든 서브 모듈로 가져 오지 않습니다 공지 사항 numpy 것으로, 예를 들면은, numpy.f2py를로드하지 않습니다 자세한 내용은 THIS 질문/대답을 참조하십시오.

(*) 여기서 모듈을로드하는 import scipy 또는 import scipy as sp과 같은 import 문을 의미합니다. 물론 import scipy.optimize을 작성하면 파이썬은 먼저 메인 모듈을로드 한 다음 서브 모듈을로드합니다.

+0

감사합니다. 그렇다면 사용자가 원하는 식별자로 모든 모듈에 대한 모든 하위 모듈을로드하는 간단한 표현은 무엇입니까? – user3317287

+0

확실한 방법이 있지만 나쁜 생각입니다. 필요한 모듈을 가져 오기 만하면됩니다. 나는 당신이 특정 모듈에서 어떤 서브 모듈을 필요로하는지 미리 알지 못한다면 더 큰 문제가 있다는 의미에서 당신이 무엇을하고 있는지 모를 것입니다. – gg349

+0

[ 이] (http://stackoverflow.com/questions/1707709/list-all-the-modules-that-are-part-of-a-python-package) 질문 비록 – gg349