위의 디렉토리에있는 Python 클래스를 가져 오는 방법은 무엇입니까?


답변:


177

from ..subpkg2 import mod

파이썬 문서 당 : 패키지 계층 구조 내에서 import 문 doc이 말한 것처럼 두 개의 점을 사용하십시오 .

가져올 모듈을 지정할 때 모듈의 절대 이름을 지정할 필요가 없습니다. 모듈 또는 패키지가 다른 패키지에 포함 된 경우 패키지 이름을 언급하지 않고도 동일한 최상위 패키지 내에서 상대 가져 오기를 수행 할 수 있습니다. 지정된 모듈 또는 패키지에서 선행 점을 사용 from하여 정확한 이름을 지정하지 않고 현재 패키지 계층 구조를 얼마나 높게 탐색 할 수 있는지 지정할 수 있습니다. 하나의 선행 점은 가져 오기를 수행하는 모듈이 존재하는 현재 패키지를 의미합니다. 두 개의 점은 하나의 패키지 레벨을 의미합니다 . 3 개의 점은 2 단계 등입니다. 따라서 패키지 from . import mod의 모듈에서 실행 pkg하면 가져 오기가 끝납니다 pkg.mod. 당신이 from ..subpkg2 import mod내에서 실행 pkg.subpkg1하면 가져옵니다pkg.subpkg2.mod. 상대 수입에 대한 규격은 PEP 328에 포함되어있다 .

PEP 328 은 절대 / 상대 수입을 다룹니다.


4
up1 = os.path.abspath ( '..') sys.path.insert (0, up1)
rp.

Pep 328은 Python-Version : 2.4, 2,5, 2.6 만 보여줍니다. 버전 3은 더 많은 지식을 가진 사람들에게 남아 있습니다.
gimel

22
이로 인해 오류가 발생합니다. ValueError : 최상위 패키지 이외의 상대 가져 오기를 시도했습니다
Carlo

4
ImportError 결과 : 알려진 상위 패키지가없는 상대 가져 오기를 시도했습니다
Rotkiv

115
import sys
sys.path.append("..") # Adds higher directory to python modules path.

1
이것은 나를 위해 작동합니다. 이것을 추가 한 후에는 ".."를 사용할 필요없이 상위 모듈을 직접 가져올 수 있습니다.
Evan Hu

8
응용 프로그램의 PWD 값-현재 directeroy가 부모의 자식 인 경우에만 작동합니다. 따라서 작동하더라도 많은 종류의 체계적인 변경으로 인해 사라질 수 있습니다.
Phlip

이것은 더 높은 수준의 모듈을 가져올 때도 효과적이었습니다. os.chdir ( "..")과 함께 사용하여 더 높은 수준의 다른 파일을로드합니다.
Surendra Shrestha

이것은 gimel의 위 답변과 동일한 오류를 유발하는 것으로 보입니다.
Carlo

81

그가 언급 한 패키지 계층 구조를 보장 할 수 있다면 @gimel의 대답은 맞습니다 . 만약 당신이 그것을 표현할 수없고, 디렉토리와 독점적으로 묶고 패키징과 관계가 없다면, 실제 디렉토리가 필요하다면 __file__부모 디렉토리를 찾기 위해 노력해야합니다 os.path.dirname. - 해당 디렉토리가 이미하지 않은 경우), 다음 ( sys.path) 앞에 추가 일시적으로 삽입 아주의 시작에서 DIR 말했다 sys.path, __import__제거, 다시 디렉토리했다 -, 지저분한 일을 참으로하지만, "때 당신이해야합니다, 당신이해야합니다"(및 Pyhon에 최선의 노력을 기울이고에 ISO C 표준이 서문의 "Spirit of C"섹션에 나와있는 것처럼 프로그래머가 수행 해야 할 작업 을 중단하지 마십시오 .

다음은 귀하에게 적합한 예입니다.

import sys
import os.path
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))

import module_in_parent_dir

2
이것은 파이썬 패키지 안에 디렉토리를 추가 sys.path하여 같은 모듈을 다른 이름과 모든 해당 버그로 사용할 수있게합니다. pypy의 autopath.py 또는 뒤틀린 _preamble.py는 디렉토리를 위쪽으로 순회하면서 최상위 패키지를 식별하는 검색 기준을 사용하여이를 해결합니다.
jfs

4
sys.path.remove(pathYouJustAdded)가져 오기 후에이 새로운 경로를 유지하지 않도록 필요한 작업을 수행 할 수 있습니다 .
Matthias

35

현재 디렉토리보다 정확히 한 수준 높은 디렉토리에서 모듈을 가져옵니다.

from .. import module

38
나는 최고 수준의 패키지를 넘어 상대적 수입을 시도했다 :(
RicardoE

25
사용 from .. import module 나는 오류가있어 ValueError를가 : 비 패키지에 상대적 가져 오기를 시도 권고에 따라
user3428154

4

디렉토리 인 모듈을로드하는 방법

서문 : 사람들을 파이썬 생태계로 편하게 데려다 줄 것이라는 희망으로 이전 답변을 상당 부분 다시 작성했으며 모든 사람들에게 파이썬의 수입 시스템으로 성공의 최고의 변화를주기를 바랍니다.

이것은 패키지 내의 상대적 수입 을 다루며 OP의 질문에 가장 가능성이 높은 것으로 생각됩니다.

파이썬은 모듈 식 시스템입니다

이것이 우리가 쓰는 import foo대신 루트 네임 스페이스에서 "foo"모듈을로드하기 위해 쓰는 이유 입니다.

foo = dict();  # please avoid doing this
with open(os.path.join(os.path.dirname(__file__), '../foo.py') as foo_fh:  # please avoid doing this
    exec(compile(foo_fh.read(), 'foo.py', 'exec'), foo)  # please avoid doing this

파이썬은 파일 시스템에 연결되지 않습니다

그렇기 때문에 Jython과 같은 가상 시스템을 제공하지 않고 사실상 파일 시스템이없는 환경에 파이썬을 포함시킬 수 있습니다.

파일 시스템에서 분리되어 가져 오기가 유연 해 지므로이 디자인은 아카이브 / zip 파일에서 가져 오기, 싱글 톤 가져 오기, 바이트 코드 캐싱, cffi 확장자, 심지어 원격 코드 정의로드와 같은 작업을 수행 할 수 있습니다.

만약 가져 오기가 파일 시스템에 연결되어 있지 않다면 "하나의 디렉토리 업"이란 무엇입니까? 휴리스틱을 선택해야하지만, 예를 들어 패키지 내에서 작업 할 때 같은 휴리스틱을 정의 하여 동일한 패키지 내에서 상대적으로 가져 오기 .foo..foo 수행 할 수 있습니다. 멋있는!

소스 코드 로딩 패턴을 파일 시스템에 진심으로 결합하려면 그렇게 할 수 있습니다. 당신은 당신의 자신의 추론을 선택해야하고, 기계를 가져 오는 어떤 종류를 사용합니다, 나는 추천 importlib을

파이썬의 importlib 예제는 다음과 같습니다 :

import importlib.util
import sys

# For illustrative purposes.
file_path = os.path.join(os.path.dirname(__file__), '../foo.py')
module_name = 'foo'

foo_spec = importlib.util.spec_from_file_location(module_name, file_path)
# foo_spec is a ModuleSpec specifying a SourceFileLoader
foo_module = importlib.util.module_from_spec(foo_spec)
sys.modules[module_name] = foo_module
foo_spec.loader.exec_module(foo_module)

foo = sys.modules[module_name]
# foo is the sys.modules['foo'] singleton

포장

https://github.com/pypa/sampleproject 공식적으로 사용 가능한 훌륭한 예제 프로젝트가 있습니다.

파이썬 패키지는 소스 코드에 대한 정보 모음으로, 다른 도구에 소스 코드를 다른 컴퓨터에 복사하는 방법과 소스 코드를 해당 시스템의 경로에 통합하여 import foo다른 컴퓨터에서 작동 하도록하는 방법을 알려줄 수 있습니다 (통역사, 호스트 운영 체제 등)

디렉토리 구조

foo일부 디렉토리 (바람직하게는 빈 디렉토리)에 패키지 이름을 가질 수 있습니다 .

some_directory/
    foo.py  # `if __name__ == "__main__":`  lives here

setup.py 파일을 작성하는 것이 더 간단 해지기 때문에 내 setup.py형제를 선호하는 foo.py것이 좋습니다. 그러나 원하는 경우 setuptools가 기본적으로 수행하는 모든 것을 변경 / 리디렉션하도록 구성을 작성할 수 있습니다. 예를 들어 foo.py, "src /"디렉토리에 두는 것은 다소 인기가 있으며 여기서 다루지 않습니다.

some_directory/
    foo.py
    setup.py

.

#!/usr/bin/env python3
# setup.py

import setuptools

setuptools.setup(
    name="foo",
    ...
    py_modules=['foo'],
)

.

python3 -m pip install --editable ./  # or path/to/some_directory/

"편집 가능" -e은 현재 정확한 파일을 설치 환경의 라이브러리에 복사하는 대신 가져 오기 기계를이 디렉토리에 소스 파일을로드하도록 다시 리디렉션합니다. 이로 인해 개발자 컴퓨터에서 동작상의 차이가 발생할 수 있으므로 코드를 테스트하십시오! pip 이외의 도구가 있지만 pip를 소개하는 것이 좋습니다. :)

또한 모듈 (단일 ".py"파일) 대신 foo"패키지"(포함 된 디렉토리 __init__.py) 를 만들고 싶습니다. "패키지"와 "모듈"을 루트 네임 스페이스에로드 할 수 있으며 모듈은 중첩 된 네임 스페이스를 허용합니다. "상대 디렉토리를 가져 오기"하려는 경우에 유용합니다.

some_directory/
    foo/
        __init__.py
    setup.py

.

#!/usr/bin/env python3
# setup.py

import setuptools

setuptools.setup(
    name="foo",
    ...
    packages=['foo'],
)

나는 또한을 좋아 foo/__main__.py, 이것은 파이썬은 예를 들어, 모듈로 패키지를 실행할 수 있습니다 python3 -m foo실행할 foo/__main__.py__main__.

some_directory/
    foo/
        __init__.py
        __main__.py  # `if __name__ == "__main__":`  lives here, `def main():` too!
    setup.py

.

#!/usr/bin/env python3
# setup.py

import setuptools

setuptools.setup(
    name="foo",
    ...
    packages=['foo'],
    ...
    entry_points={
        'console_scripts': [
            # "foo" will be added to the installing-environment's text mode shell, eg `bash -c foo`
            'foo=foo.__main__:main',
        ]
    },
)

더 많은 모듈로 이것을 해결할 수 있습니다. 기본적으로 다음과 같은 디렉토리 구조를 가질 수 있습니다.

some_directory/
    bar.py           # `import bar`
    foo/
        __init__.py  # `import foo`
        __main__.py
        baz.py       # `import foo.baz
        spam/           
            __init__.py  # `import foo.spam`
            eggs.py      # `import foo.spam.eggs`
    setup.py

setup.py 일반적으로 다음과 같은 소스 코드에 대한 메타 데이터 정보를 보유합니다.

  • "install_requires"라는 이름의 설치에 필요한 종속성
  • 패키지 관리에 어떤 이름을 사용해야합니까 (install / uninstall "name"),이 경우 기본 파이썬 패키지 이름과 일치하는 것이 좋습니다 ( foo하이픈을 밑줄로 대체하는 것이 일반적 임)
  • 라이센스 정보
  • 성숙도 태그 (알파 / 베타 / 등),
  • 잠재 고객 태그 (개발자, 기계 학습 등)
  • README와 같은 단일 페이지 문서 내용
  • 쉘 이름 (bash와 같은 사용자 쉘에 입력 한 이름 또는 시작 메뉴와 같은 그래픽 사용자 쉘에있는 이름),
  • 이 패키지가 설치하고 제거 할 파이썬 모듈 목록
  • 사실상 "테스트 실행"진입 점 python ./setup.py test

소스 모듈이 개발 시스템에 설치되어 있으면 확장 성이 뛰어나고 c 확장을 즉시 컴파일 할 수도 있습니다. 매일 예를 들어 PYPA Sample Repository의 setup.py를 권장합니다.

빌드 아티팩트 (예 : 거의 동일한 컴퓨터를 실행하기위한 코드 사본)를 공개하는 경우 requirements.txt 파일은 정확한 종속성 정보를 스냅 샷하는 일반적인 방법입니다. 여기서 "install_requires"는 최소 및 최대 호환 버전. 그러나 대상 컴퓨터가 거의 동일하므로 전체 파이썬 접두사로 tarball을 만드는 것이 좋습니다. 여기에 들어가기가 까다로울 수 있습니다. pip install--target옵션 또는 virtualenv 일명 venv를 확인하십시오 .

다시 예제로

한 디렉토리로 파일을 가져 오는 방법 :

foo / spam / eggs.py에서 foo / baz의 코드를 원한다면 절대 네임 스페이스로 요청할 수 있습니다.

import foo.baz

나중에 다른 상대 baz구현 으로 eggs.py를 다른 디렉토리로 옮기는 기능을 예약하려면 다음과 같은 상대 가져 오기를 사용할 수 있습니다.

import ..baz

-5

파이썬은 모듈 식 시스템입니다

파이썬은 파일 시스템에 의존하지 않습니다

파이썬 코드를 안정적으로로드하려면 해당 코드를 모듈에 넣고 해당 모듈을 파이썬 라이브러리에 설치하십시오.

설치된 모듈은 항상 최상위 네임 스페이스에서로드 할 수 있습니다. import <name>


https://github.com/pypa/sampleproject 공식적으로 사용 가능한 훌륭한 샘플 프로젝트가 있습니다.

기본적으로 다음과 같은 디렉토리 구조를 가질 수 있습니다.

the_foo_project/
    setup.py  

    bar.py           # `import bar`
    foo/
      __init__.py    # `import foo`

      baz.py         # `import foo.baz`

      faz/           # `import foo.faz`
        __init__.py
        daz.py       # `import foo.faz.daz` ... etc.

.

당신의 선언하십시오 setuptools.setup()에서를 setup.py,

공식 예 : https://github.com/pypa/sampleproject/blob/master/setup.py

우리의 경우 우리는 아마 내보낼 bar.py하고 foo/__init__.py, 내 간단한 예제 :

setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    ...
    py_modules=['bar'],
    packages=['foo'],
    ...
    entry_points={}, 
        # Note, any changes to your setup.py, like adding to `packages`, or
        # changing `entry_points` will require the module to be reinstalled;
        # `python3 -m pip install --upgrade --editable ./the_foo_project
)

.

이제 파이썬 라이브러리에 모듈을 설치할 수 있습니다. pip를 사용하면 the_foo_project편집 모드에서 파이썬 라이브러리에 설치할 수 있으므로 실시간으로 작업 할 수 있습니다

python3 -m pip install --editable=./the_foo_project

# if you get a permission error, you can always use 
# `pip ... --user` to install in your user python library

.

이제 모든 파이썬 컨텍스트에서 공유 py_modules 및 패키지를로드 할 수 있습니다

foo_script.py

#!/usr/bin/env python3

import bar
import foo

print(dir(bar))
print(dir(foo))

2
나는 pip install --edit foo거의 항상 virtualenv 내부에서 작업하면서 모듈을 항상 설치한다고 언급해야합니다 . 나는 설치되지 않은 모듈을 거의 쓰지 않습니다. 내가 알고 싶은 것을 오해하면
ThorSummoner

또한 tox와 같은 venv-auto-creation 테스트 스위트를 사용하는 것은 editable계란 링크와 설치된 python 모듈이 모든면에서 정확히 동일하지 않기 때문에 매우 유용합니다 . 예를 들어, 편집 가능한 모듈에 새 네임 스페이스를 추가하면 경로 조회에서 찾을 수 있지만 setup.py 파일로 내 보내지 않으면 패키지화 / 설치되지 않습니다! 사용 사례 테스트 :)
ThorSummoner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.