programing

Python: 하위 패키지 또는 하위 모듈 가져오기

javajsp 2023. 7. 23. 14:02

Python: 하위 패키지 또는 하위 모듈 가져오기

이미 플랫 패키지를 사용했기 때문에 중첩 패키지에서 발생하는 문제를 예상하지 못했습니다.여기에…

디렉토리 레이아웃

dir
 |
 +-- test.py
 |
 +-- package
      |
      +-- __init__.py
      |
      +-- subpackage
           |
           +-- __init__.py
           |
           +-- module.py

init.py 의 내용

둘다요.package/__init__.py그리고.package/subpackage/__init__.py비어 있습니다.

『 』의 module.py

# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...

『 』의 test.py 버전3가지 버전)

버전 1

# file test.py
from package.subpackage.module import *
print attribute1 # OK

이것은 물건을 가져오는 나쁘고 안전하지 않은 방법입니다(모두 대량으로 가져오기). 하지만 효과가 있습니다.

버전 2

# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1

항목별로 더 안전하게 가져올 수 있는 방법이지만 실패합니다. Python은 이것을 원하지 않습니다. "No module named module" 메시지와 함께 실패합니다.하지만…

# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here

말하다<module 'package.subpackage.module' from '...'>저건 모듈이지만 /-P 8-O 모듈은 아닙니다...

버전 3

# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK

이거 효과가 있어요.그래서 당신은 항상 오버킬 접두사를 사용해야 하거나 버전 #1처럼 안전하지 않은 방법을 사용해야 하며 파이썬에 의해 안전하고 편리한 방법을 사용할 수 없도록 되어 있습니까?파이썬이 거부하는 유일한 방법은 안전하고 불필요한 긴 접두사를 피하는 것입니까?이 사하기때요까문일랑?▁it를 사랑하기 때문입니까?import *또는 지나치게 긴 접두사를 좋아하기 때문에(이 관행을 시행하는 데 도움이 되지 않음)?

어려운 말을 해서 미안하지만, 이틀 동안 이런 바보 같은 행동을 피하려고 노력하고 있습니다.제가 어딘가에서 완전히 틀린 것이 아니라면, 이것은 Python의 패키지 및 하위 패키지 모델에서 정말로 무언가가 손상되었다는 느낌을 남기게 될 것입니다.

메모들

  • 는 의지고싶않요아에 않습니다sys.path도, 전계적인부피위해기하을또작한용세, ▁to한또▁on.*.pth파일, 이것은 단지 가지고 노는 또 다른 방법일 뿐입니다.sys.path같은 세계적인 효과를 가지고 있습니다.솔루션이 깨끗해지려면 로컬 솔루션이어야 합니다.Python은 서브패키지를 처리할 수도 있고 처리할 수도 없지만 로컬 항목을 처리하기 위해 글로벌 구성을 사용할 필요는 없습니다.
  • 저는 또한 수입품을 사용해 보았습니다.package/subpackage/__init__.py하지만 그것은 아무것도 해결하지 못했고, 똑같이 했고 불평했습니다.subpackage아닌 에 "는 " " 입니다.print subpackage모듈이라고 합니다(다시 말해, 잘못된 행동).

제가 완전히 틀렸을 수도 있지만(제가 선호하는 옵션), 이것은 Python에 대해 많은 실망을 느끼게 합니다.

제가 시도한 세 가지 방법 외에 다른 알려진 방법이 있나요?내가 모르는 것?

(계속)

%< -----편집 ----- >% -----

지금까지의 결론 (사람들의 의견 이후)

Python에는 실제 하위 패키지와 같은 것이 없습니다. 모든 패키지 참조가 글로벌 사전으로 이동하기 때문입니다. 즉, 로컬 사전이 없으므로 로컬 패키지 참조를 관리할 방법이 없습니다.

전체 접두사 또는 짧은 접두사 또는 별칭을 사용해야 합니다.다음과 같이:

전체 접두사 버전

from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)

짧은 접두사 버전(단, 반복 접두사)

from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place

또는 위의 변형입니다.

from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context

인수 분해 버전

여러 엔티티를 일괄적으로 한 번에 가져오는 것이 문제가 되지 않는 경우 다음 작업을 수행할 수 있습니다.

from package.subpackage.module import attribute1, attribute2
# and etc.

제가 처음으로 좋아하는 취향은 아니지만(수입 품목당 수입 명세서가 하나씩 있는 것을 선호합니다), 개인적으로 선호할 수도 있습니다.

업데이트(2012-09-14):

마지막으로 레이아웃에 대한 설명을 제외하고 실제로는 문제가 없는 것으로 보입니다.위의 내용 대신 다음을 사용했습니다.

from package.subpackage.module import (

    attribute1, 
    attribute2,
    attribute3,
    ...)  # and etc.

당신은 어떻게 오해하고 있는 것처럼 보입니다.import모듈을 검색합니다.가져오기 문을 사용하면 항상 실제 모듈 경로를 검색합니다(및/또는sys.modules이전에 가져오기 때문에 로컬 네임스페이스에 있는 모듈 개체를 사용하지 않습니다.다음 작업을 수행할 때:

import package.subpackage.module
from package.subpackage import module
from module import attribute1

라는 패키지를 찾습니다.package.subpackage 수입 및수품입module그 소포에서.이 선은 세 번째 선에는 영향을 주지 않습니다.은 세번줄다음같찾모습다니라는 .module하나도 못 찾겠어요호출된 개체를 "재사용"하지 않습니다.module당신이 위 라인에서 얻은 것.

말로 다말입다니른다.from someModule import ..."이전에 가져온 some Module이라는 모듈에서"라는 의미가 아닙니다. 수 에서..."라는 의미입니다."를 의미합니다.모듈 경로로 이어지는 패키지를 가져와 모듈 경로를 "증분적으로" 구축할 수 있는 방법은 없습니다.가져올 때는 항상 전체 모듈 이름을 참조해야 합니다.

당신이 무엇을 성취하려고 하는지는 분명하지 않습니다.특정 개체 속성1만 가져오려면 다음을 수행합니다.from package.subpackage.module import attribute1그리고 그것을 끝냅니다.당신은 긴 시간에 대해 걱정할 필요가 없습니다.package.subpackage.module원하는 이름을 가져오면 됩니다.

나중에 다른 이름에 액세스할 수 있도록 모듈에 액세스하려면 다음을 수행할 수 있습니다.from package.subpackage import module그리고, 당신이 본 것처럼, 당신은 할 수 있습니다.module.attribute1얼마든지 가능합니다.

둘 다 원한다면 --- 즉, 당신이 원한다면.attribute1직접 접근할 수 있고 당신이 원하는.module액세스 가능. 위의 두 가지 작업을 모두 수행합니다.

from package.subpackage import module
from package.subpackage.module import attribute1
attribute1 # works
module.someOtherAttribute # also works

입력하는 것을 좋아하지 않는 경우package.subpackage두 번이라도 속성1에 대한 로컬 참조를 수동으로 생성할 수 있습니다.

from package.subpackage import module
attribute1 = module.attribute1
attribute1 # works
module.someOtherAttribute #also works

는 2번이 실패했기 입니다.sys.modules['module']한 범위를 , "" (가존기지않다니습범고가재위볼다다를있지수음을없고니으며습한유은틴루하져오가▁the▁see▁has(▁does볼존다수없다재,the▁and니습▁cannot)"를 볼 수 없습니다).module 이름컬로이름다, 없고습니가 .module모듈 또는 패키지를 디스크에 저장합니다.가져온 이름을 여러 개 쉼표로 구분할 수 있습니다.

from package.subpackage.module import attribute1, attribute2, attribute3

또한:

from package.subpackage import module
print module.attribute1

만약 당신이 글로벌 네임스페이스에서 attribute1을 얻는 것만 시도한다면, 버전 3은 문제가 없을 것 같습니다.왜 오버킬 접두사야?

버전 2에서는 대신

from module import attribute1

할수있습니다

attribute1 = module.attribute1

언급URL : https://stackoverflow.com/questions/12229580/python-importing-a-sub-package-or-sub-module