2012-08-31 2 views
2

모두.파이썬 : 파이썬 네임 스페이스/패키지에서 모든 것을 가져 오기

나는 쉽게 대답 할 수 있다고 생각하지만, 그렇지 않습니다. 제가 답변을 찾고있는 한, 나는 단순한 것을 간과하고 있다고 생각합니다. MyTestProjectNamespace가 SecondTestProjectNamespace에 대한 참조를 가지고

MyTestProject 
     /src 
      /TestProjectNamespace 
       __init__.py 
       Module_A.py 
       Module_B.py 

    SecondTestProject 
     /src 
      /SecondTestProjectNamespace 
       __init__.py 
       Module_1.py 
       Module_2.py 
       ... 
       Module_10.py 

참고 :

나는 다음과 같은 패키지 구조의 파이썬 작업 공간을 가지고있다.

MyTestProjectNamespace에서 SecondTestProjectNamespace의 모든 항목을 가져와야합니다.

from SecondTestProjectNamespace.Module_A import * 
    from SecondTestProjectNamespace.Module_B import * 

을 ...하지만 SecondTestProject가 50 개 모듈이있는 경우이 실용적이지 않다 : 나는 다음과 같은 문장 (들)을 한 번에 하나 개의 모듈을 가져올 수 있습니다.

파이썬은 네임 스페이스/패키지의 모든 것을 가져 오는 방법을 지원합니까? 어떤 도움을 주시면 감사하겠습니다.

미리 감사드립니다.

+1

일반적으로'import *'를 사용하면 네임 스페이스가 혼란 스럽기 때문에 권장하지 않습니다. 그리고 프로젝트에 50 개의 모듈이 있고 그 모듈 중 50 개 모두에서 모든 것을 가져 오려면 다음과 같이하십시오. –

답변

1

예, 이것을 pkgutil을 사용하여 굴릴 수 있습니다.

여기 (시험 제외) 트위스트 아래의 모든 패키지를 나열 예, 그리고 그것들을 가져옵니다

# -*- Mode: Python -*- 
# vi:si:et:sw=4:sts=4:ts=4 

import pkgutil 
import twisted 

for importer, modname, ispkg in pkgutil.walk_packages(
    path=twisted.__path__, 
    prefix=twisted.__name__+'.', 
    onerror=lambda x: None): 
     # skip tests 
     if modname.find('test') > -1: 
      continue 
     print(modname) 
     # gloss over import errors 
     try: 
      __import__(modname) 
     except: 
      print 'Failed importing', modname 
      pass 

# show that we actually imported all these, by showing one subpackage is imported 
print twisted.python 

내가 스타 수입은 나쁜 생각있는 다른 포스터에 동의해야합니다.

+0

감사합니다, 토마스. 미안해. 너에게 돌아 가기까지 너무 오래 걸렸다. 하루가 끝나면 사용하려는 모듈에서 각 클래스를 가져와야합니다. Init.py는 철자를 쓰면 도움이됩니다. 감사. – BobaFett

0

파이썬은 네임 스페이스/패키지의 모든 것을 가져 오는 방법을 지원합니까?

아니요 패키지는 수퍼 모듈이 아닙니다. 패키지는 함께 그룹화 된 모듈의 모음입니다. 이유


적어도 일부는 '모든'폴더 안에 무엇을 의미하는지 결정하기 위해 사소한 아니다 것입니다 ... 네트워크 드라이브, 소프트 링크, 하드 링크, 같은 문제가

1

없음 SecondTestProject를 설정하면 __init__.py에 코드를 입력하여 하위 모듈의 모든 내용을 자동으로 가져올 수 있습니다. from ... import *을 참조하십시오. __import__ 함수 및/또는 imp 모듈을 사용하여 어느 정도 자동화 할 수도 있습니다. 그러나 이 아닌 방식으로 설정하여이 방법으로 작동하게하는 패키지를 빠르고 쉽게 얻을 수있는 방법은 없습니다.

어쨌든 좋은 생각이 아닙니다. 모듈이 50 개있는 경우 모든 모듈을 전역 네임 스페이스로 가져 오는 것은 이름의 확산을 일으키고 그 이름 사이의 충돌 가능성이 높습니다.

+0

Thanks, Bren. 예, 저는 파이썬 초보자입니다. 나는 이것을 더 자세히 설명 할 것이다 : 나는 SecondTestProjectNamespace에 50 개의 모듈을 가지고 있다고 가정한다. 각 모듈에는 내부에 하나의 클래스가 정의되어 있습니다. Module_A.py에는 Module_A라는 클래스가 있습니다. SecondTestNamespace에서 다른 모듈의 모든 * modules *를 참조하려고합니다. 따라서 새 인스턴스를 만들고 조작 할 수 있습니다. 수입 진술이 최선의 방법이라고 생각했습니다. 더 좋은 방법이 있다면 알려주세요. – BobaFett

+1

@BobaFett : 왜 각 모듈에는 하나의 클래스 만 있습니까? 이것은 종종 사람들이 실수로 파이썬에 적용하는 Java 사고 방식입니다. 파이썬에서는 동일한 모듈에 많은 클래스를 갖는 것이 완벽합니다. – BrenBarn

+0

모듈의 인스턴스를 만들 수 없습니다. – katrielalex

1

다른 사람이 말한 것처럼 좋은 생각이 아닙니다. 그러나 yur 네임 스페이스를 유지하고 이름 충돌을 피하는 방법이 있습니다. 패키지 모듈 사용자가 단일 모듈을 통해 모든 모듈/서브 패키지를 사용할 수 있습니다.

일부 "b"변수를 정의하는 "a.py"라는 모듈 안에 "pack"이라는 패키지가 있다고 가정 해 보겠습니다.내가하고 싶은 모든입니다 :이 일을

>>> import pack 
>>> pack.a.b 
1 

한 가지 방법은 pack/__init__.pyimport a라는 한 줄을 추가하는 것입니다 - 따라서 귀하의 경우에 당신이 fiffty 같은 라인을 필요 했어, 날짜로 유지.

나쁘지 않습니다.

그러나 http://docs.python.org/tutorial/modules.html#importing-from-a-package의 문서 - 당신은 당신의 __ini__.py 파일에 __all__라는 문자열 목록이있는 경우, 그 목록에있는 모든 모듈/서브 패키지 이름이 하나가 혼자 것 반 from pack import *

을 수행 할 때 가져 오는 것을 말한다 -work -하지만 wuld는 패키지 사용자가 권장하지 않는 "from x import *"형식을 수행하도록 요구합니다.

그러나 - 당신은 __all__ 변수를 정의한 후, __init__.py 자체 내부의 "... 수입 *"를 할 수있는 - 그래서 당신이해야 할 일까지 __all__을 유지하는 것입니다 다음 TestProjectNamespace/__init__.py으로

다음과 같이되는 :

__all__ = ["Module_A", "Module_B", ...] 
from TestProjectNamespace import * 

사용자가 TestProjectNamespace의 수입시 사용할 수 TestProjectNamespace.Module_A (및 기타)을 가질 것이다.

그리고 물론 - 당신은 __all__의 생성을 자동화 할 수 있습니다. 그것은 결국 변수 일뿐입니다. 그러나 나는 그것을 권장하지 않습니다.

+0

고마워, Jsbueno. Module1, Module2 등을 TestProjectNamespace에서 어떻게 사용할 수 있습니까? Module1, Module2 등은 TestProjectNamespace가 아닌 * SecondTestProjectNamespace * 패키지에 있습니다. – BobaFett

+0

'SecondTest ... '에서 같은 기술을 사용한다면'TestProject'에서'SecontTestProjectNameSpace 가져 오기'를하고''SecondTestProjectNameSpace.Module_1'을 사용할 수도 있습니다 - 또는 SecondTest ..에서 *를 가져올 수도 있습니다 – jsbueno