source

Python에서 네임스페이스 패키지를 만들려면 어떻게 해야 합니까?

factcode 2023. 7. 18. 21:59
반응형

Python에서 네임스페이스 패키지를 만들려면 어떻게 해야 합니까?

Python에서 네임스페이스 패키지를 사용하면 여러 프로젝트 간에 Python 코드를 배포할 수 있습니다.이 기능은 관련 라이브러리를 별도의 다운로드로 릴리스하려는 경우 유용합니다.가 " " "일 경우에는 " " " 입니다.Package-1그리고.Package-2PYTHONPATH,

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네임스페이스를 선언하면 자유롭게 이동할 수 있습니다.

이것은 오래된 질문이지만, 최근에 누군가가 제 블로그에 네임스페이스 패키지에 대한 제 게시물이 여전히 관련이 있다고 댓글을 달았습니다. 그래서 이 게시물이 어떻게 진행되는지에 대한 실질적인 예를 제공하기 때문에 여기에 링크를 붙여야겠다고 생각했습니다.

https://web.archive.org/web/20150425043954/http ://cdent.tumblr.com/post/216241761/python-namespace-packages-for-tiddlyweb

현재 진행 중인 주요 내용은 다음과 같습니다.

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

반응형