Python에서 네임스페이스 패키지를 만들려면 어떻게 해야 합니까?
Python에서 네임스페이스 패키지를 사용하면 여러 프로젝트 간에 Python 코드를 배포할 수 있습니다.이 기능은 관련 라이브러리를 별도의 다운로드로 릴리스하려는 경우 유용합니다.가 " " "일 경우에는 " " " 입니다.Package-1
그리고.Package-2
PYTHONPATH
,
Package-1/namespace/__init__.py
Package-1/namespace/module1/__init__.py
Package-2/namespace/__init__.py
Package-2/namespace/module2/__init__.py
최종 사용자는 할 수 있습니다.import namespace.module1
그리고.import namespace.module2
.
둘 이상의 Python 제품이 해당 네임스페이스에 모듈을 정의할 수 있도록 네임스페이스 패키지를 정의하는 가장 좋은 방법은 무엇입니까?
TL;DR:
3 Python 3.3을 .에서는 아무것도 할 필요가 없으며, 아무것도 넣지 않습니다.__init__.py
네임스페이스 패키지 디렉토리에서 사용할 수 있습니다. 버전에서는 3.3을 합니다.pkgutil.extend_path()
▁에 대한 해결책pkg_resources.declare_namespace()
첫째, 미래에 대비하고 암시적 네임스페이스 패키지와 이미 호환되기 때문입니다.
Python 3.3에는 암시적 네임스페이스 패키지가 도입되었습니다(PEP 420 참조).
즉, 이제 세 가지 유형의 객체가 생성될 수 있습니다.import foo
:
- 로 되는 모듈
foo.py
- 패키지로, " 디토리는일패지"로됩니다.
foo
포는하를__init__.py
- 입니다.
foo
것도 없이__init__.py
파일
패키지도 모듈이지만, 여기서 "모듈"이라고 하면 "비패키지 모듈"을 의미합니다.
먼저검니다합색을 스캔합니다.sys.path
모듈 또는 일반 패키지의 경우.성공하면 검색을 중지하고 모듈 또는 패키지를 만들고 초기화합니다.모듈이나 일반 패키지를 찾지 못했지만 하나 이상의 디렉터리를 찾은 경우 네임스페이스 패키지를 만들고 초기화합니다.
및 에는 " " " "가 있습니다.__file__
을시는으로 .py
파일이 생성되었습니다. 패키지의 이름은 " " " 입니다.__path__
파일이 생성된 디렉토리로 설정됩니다.
을 할 때는.import foo.bar
은 의검색먼수다니됩행저에 대해 됩니다.foo
그리고 만약 패키지가 발견된다면, 검색은bar
으로 .foo.__path__
경검로로 대신 sys.path
.한다면foo.bar
발됨견,foo
그리고.foo.bar
생성 및 초기화됩니다.
그렇다면 일반 패키지와 네임스페이스 패키지는 어떻게 혼합됩니까?, 에는 그렇지 않았어요.pkgutil
명시적 네임스페이스 패키지 메서드가 암시적 네임스페이스 패키지를 포함하도록 확장되었습니다.
의 정규 가 있는 __init__.py
다음과 같이:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
레거시 동작은 검색된 경로에 있는 다른 일반 패키지를 추가하는 것입니다.__path__
파이썬 3.3에서는 네임스페이스 패키지도 추가합니다.
따라서 다음과 같은 디렉터리 구조를 가질 수 있습니다.
├── path1
│ └── package
│ ├── __init__.py
│ └── foo.py
├── path2
│ └── package
│ └── bar.py
└── path3
└── package
├── __init__.py
└── baz.py
두 의 리고그둘있한는이그한▁as▁the▁two▁long▁as는▁and있이둘.__init__.py
다가 나다extend_path
선(및))path1
,path2
그리고.path3
당신 안에 있습니다.sys.path
)import package.foo
,import package.bar
그리고.import package.baz
모두 작동할 것입니다.
pkg_resources.declare_namespace(__name__)
암시적 네임스페이스 패키지를 포함하도록 업데이트되지 않았습니다.
주어진 네임스페이스에 모듈을 '추가'할 수 있는 pkgutil이라는 표준 모듈이 있습니다.
제공한 디렉토리 구조를 사용하여 다음 작업을 수행합니다.
Package-1/namespace/__init__.py
Package-1/namespace/module1/__init__.py
Package-2/namespace/__init__.py
Package-2/namespace/module2/__init__.py
당신은 그 두 줄을 둘 다 넣어야 합니다.Package-1/namespace/__init__.py
그리고.Package-2/namespace/__init__.py
(*):
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
(* - 그들 사이의 종속성을 명시하지 않으면 - 그들 중 어떤 것이 먼저 인식될지 모르기 때문에 - 자세한 내용은 PEP 420을 참조하십시오.)
설명서에 나와 있듯이 다음과 같습니다.
이은패에추니다됩가에 입니다.
__path__
의모디하디리에 있는 의 모든 하위sys.path
패키지의 이름을 따서 명명되었습니다.
이제부터 당신은 두 개의 패키지를 독립적으로 배포할 수 있습니다.
간단히 말해서, 네임스페이스 코드를 입력합니다.__init__.py
, 파일 이름setup.py
네임스페이스를 선언하면 자유롭게 이동할 수 있습니다.
이것은 오래된 질문이지만, 최근에 누군가가 제 블로그에 네임스페이스 패키지에 대한 제 게시물이 여전히 관련이 있다고 댓글을 달았습니다. 그래서 이 게시물이 어떻게 진행되는지에 대한 실질적인 예를 제공하기 때문에 여기에 링크를 붙여야겠다고 생각했습니다.
현재 진행 중인 주요 내용은 다음과 같습니다.
http://www.siafoo.net/article/77#multiple-distributions-one-virtual-package
그__import__("pkg_resources").declare_namespace(__name__)
트릭은 Tiddly Web의 플러그인 관리를 거의 주도하고 있으며 지금까지 잘 되고 있는 것으로 보입니다.
Python 네임스페이스 개념이 전면에 배치되어 있으므로 Python에서는 패키지를 모듈에 넣을 수 없습니다.패키지에는 모듈이 포함되어 있습니다.
Python 패지다단포폴함더다니가 포함된 입니다.__init__.py
일파에 의입니다. 모듈은 패키지의 다른 파일입니다(또는 직접적으로PYTHONPATH
가 경우.py
두되어 있지 않습니다.예를 들어 두 개의 패키지가 있지만 모듈이 정의되어 있지 않습니다.패키지가 파일 시스템 폴더이고 모듈이 파일인 경우 패키지에 모듈이 포함된 이유를 알 수 있습니다.
따라서 Python 경로에 배치한 파일 시스템의 폴더가 Package-1 및 Package-2라고 가정하는 예제에서는 다음과 같은 기능을 사용할 수 있습니다.
Package-1/
namespace/
__init__.py
module1.py
Package-2/
namespace/
__init__.py
module2.py
가 하나 .namespace
의 모듈이 module1
그리고.module2
그리고 정당한 이유가 없는 한, 아래와 같은 python 경로에 모듈을 폴더에 배치해야 할 것입니다.
Package-1/
namespace/
__init__.py
module1.py
module2.py
언급URL : https://stackoverflow.com/questions/1675734/how-do-i-create-a-namespace-package-in-python
'source' 카테고리의 다른 글
Python에서 문자열과 정수 연결 (0) | 2023.07.18 |
---|---|
두 세그먼트가 교차하는지 확인하려면 어떻게 해야 합니까? (0) | 2023.07.18 |
눈금 레이블 값은 숨기지만 축 레이블은 유지 (0) | 2023.07.18 |
기존 정보를 보존하면서 다른 유형 및 메시지로 예외 다시 발생 (0) | 2023.07.13 |
더 큰 스레드 풀을 사용하는 대신 비동기 요청을 사용하는 이유는 무엇입니까? (0) | 2023.07.13 |