programing

위의 디렉토리에 있는 Python 클래스를 Import하려면 어떻게 해야 합니까?

kingscode 2022. 10. 30. 20:29
반응형

위의 디렉토리에 있는 Python 클래스를 Import하려면 어떻게 해야 합니까?

현재 디렉터리 위의 파일에 있는 클래스에서 상속하고 싶습니다.

그 파일을 비교적 Import할 수 있습니까?

from ..subpkg2 import mod

Python 문서에 따르면:패키지 계층 내에 있는 경우 Import 스테이트먼트 문서의 설명에 따라 두 개의 점을 사용합니다.

Import할 모듈을 지정할 때 모듈의 절대 이름을 지정할 필요는 없습니다.모듈 또는 패키지가 다른 패키지에 포함되어 있는 경우 패키지 이름을 언급하지 않고 동일한 상위 패키지 내에서 상대 Import를 수행할 수 있습니다." " " " 뒤에 된 모듈 에 선행 from정확한 이름을 지정하지 않고 현재 패키지 계층 위로 이동할 높이를 지정할 수 있습니다.선행 도트 1개는 Import하는 모듈이 존재하는 현재 패키지를 의미합니다. 개의 점은 하나의 패키지 레벨 위임을 의미합니다.점 3개는 2단계 위쪽에 있습니다.그래서 만약 당신이from . import mod" "의 pkg가 Import .pkg.mod 「 」를 from ..subpkg2 import mod에서)pkg.subpkg1.pkg.subpkg2.mod상대 수입 규격은 PEP 328에 포함되어 있습니다.

PEP 328은 절대/상대적인 수입을 취급합니다.

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

@paramel의 답변은 가 언급한 패키지 계층을 보장할 수 있다면 정확합니다.표현대로 디렉토리에만 얽매여 패키징과 전혀 관계가 없는 경우, 실제로 필요한 것이 없는 경우, 작업을 진행해야 합니다.__file__ 명부를 os.path.dirname이 유효하다이 디렉토리가 온이 아닌 )sys.path으로 해당 합니다.sys.path,__import__다시 한 번 상기 dir를 삭제해 주세요.- 정말 지저분한 작업이지만, "꼭 해야 할 때, 당신은 해야 합니다." (그리고 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

현재 디렉토리보다 정확히1레벨 위의 디렉토리에서 모듈을 Import합니다.

from .. import module

디렉토리 업 상태의 모듈을 로드하는 방법

서문:나는 사람들이 비단뱀의 생태계에 쉽게 들어갈 수 있도록 돕고, 비단뱀의 수입 시스템으로 모두에게 최고의 성공을 가져다 줄 수 있기를 바라며 이전 답변을 대폭 수정했다.

이것은 패키지 내의 상대적인 수입을 커버하는 것으로, OP의 질문에 가장 가능성이 높은 케이스라고 생각합니다.

Python은 모듈식 시스템입니다.

씁니다.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

Python은 파일 시스템에 연결되어 있지 않습니다.

이것이 바로 Jython과 같은 가상 파일 시스템을 제공하지 않고 디팩토 파일 시스템이 없는 환경에 python을 내장할 수 있는 이유입니다.

파일 시스템에서 분리하면 Import를 유연하게 수행할 수 있습니다.이 설계에서는 아카이브/zip 파일에서 Import, 싱글톤 Import, 바이트 코드 캐싱, cffi 확장명, 원격 코드 정의 로딩 등의 작업을 수행할 수 있습니다.

Import가 파일 시스템에 결합되지 않은 경우 "1개의 디렉토리 업"은 무엇을 의미합니까?몇 가지 휴리스틱을 골라야 하는데, 예를 들어 패키지 내에서 작업할 때 같은 패키지 내에서 상대적인 수입을 가능하게 하는 휴리스틱스가 이미 정의되어 있습니다.멋지네요!

소스 코드 로드 패턴을 파일 시스템에 진심으로 결합하고 싶다면 그렇게 할 수 있습니다.직접 휴리스틱을 선택하고, 수입 기계 같은 것을 사용해야 합니다, importlib을 추천합니다.

Python의 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, system등합니다.

디렉토리 구조

패키지 이름을 지정합시다.foo일부 디렉토리(아마도 빈 디렉토리)에 있습니다.

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

제 취향은 의 형제로서 만드는 것입니다.foo.pypy 할 수 있기 , 모든 의 변경할 수 를 들어, 「setup.py 」 、 「 setuptools 」 、 「 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는 Import 머신을 다시 리다이렉트하여 이 디렉토리에 소스 파일을 로드합니다.그 대신 현재 파일을 설치 환경의 라이브러리에 복사합니다.가 생기는 이 있습니다.를 꼭 해!」, 「코드 테스트」, 「코드 테스트」, 「코드 테스트」를 참조해 주세요.드를를테테! 여러 가지 , 는 pip을 :) pip은 pip으로, pip으로, pip으로 하는 것이 좋습니다.

저도 만드는 걸 좋아해요.foo명부」라고 , 「명부」를 포함한 .__init__.py관심을 가지다모듈은 네스트된 네임스페이스를 허용하므로 "interest one directory up" 가져오기를 원할 때 유용합니다.

some_directory/
    foo/
        __init__.py
    setup.py

.

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

import setuptools

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

도 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★foo/__main__.py"python"과 패키지를 모듈로 실행할 수 있습니다.python3 -m foofoo/__main__.py as ~하듯이__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_install"이라는 이름의 설치에 필요한 종속성
  • 패키지 관리(예: name ") " 니 합 안 을 다 의 치 리 과 / 시 manage / should 우 치 킬 야foo, 하이픈에 대한 밑줄을 대체하지만 하 substit though 용 반 이적hens is만 hyp일uting popular지이것ores undersc for사밑대는하을줄신픈이 thoughhens is hyp
  • 라이선스 정보
  • 성숙도 태그(알파/알파벳 등),
  • 시청자 태그(개발자용, 머신 러닝용 등)
  • 1페이지 분량의 문서 콘텐츠(README 등),
  • 셸 이름(bash와 같은 사용자 셸에 입력하는 이름 또는 시작 메뉴와 같은 그래픽 사용자 셸에 있는 이름),
  • 이 패키지가 설치(및 제거)하는 python 모듈 목록
  • "실 테스트" 항목 포인트 토 스 테 트 점 입 ' a" tests pointact)python ./setup.py test

소스 모듈이 개발 머신에 설치되어 있는 경우 확장자 c개를 바로 컴파일할 수 있습니다.일상적인 예로는 PYPA 샘플 저장소 설정을 권장합니다.화이

빌드 아티팩트를 해제하면 거의 동일한 컴퓨터를 실행하려는 코드 복사본이 필요합니다.드 티 리 스 하 우 t 일 동 한 다 니 드 ) is and way compatation way file_ depend exactible minimumency versions maximum capture snapshotrequires a atxt 파일은 정확한 의존관계 정보를 스냅하는 일반적인 방법입니다.여기서 "install_displaces"는 호환 가능한 최소 버전과 최대 버전을 캡처하는 데 적합합니다.그러나 대상 시스템이 거의 동일하다고 하더라도 파이썬 접두사의 타이를 만드는 것이 좋습니다.다만, 타겟 머신이 거의 동일하기 때문에, 파이썬 프리픽스 전체의 tarball을 작성하는 것을 강하게 추천합니다.이것은 너무 까다로워질 수 있습니다.여기 들어오기엔 너무 세밀하고 까다로울 수 있어 Check out 체크 아웃pip install's 의--target가상 환경(가상 환경)

예시로 돌아가서

디렉토리 1개 위로 파일을 Import 하는 방법:

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

import foo.baz

py를 할 수 에그를 .py를 다른 디렉토리로 이동하는 기능을 예약하고 싶은 경우baz수입하다

import ..baz

여기 ThorSummoner의 답변을 알기 쉽게 하기 위해 3단계, 다소 미니멀리즘적인 버전이 있습니다.내 뜻대로 되진 않지만(아래에서 설명하겠습니다) 잘 작동합니다.

1: 및 「」1: 「」setup.py

filepath_to/project_name/
    setup.py

»setup.py , 쓰기:

import setuptools

setuptools.setup(name='project_name')

순서 2: 이 디렉토리를 패키지로 인스톨 합니다.

콘솔에서 다음 코드 실행:

python -m pip install --editable filepath_to/project_name

python , 을 사용해야 할 수도 .python3비단뱀 ,을 사용할 수 .-e--editable.

디렉토리는 대략 다음과 같습니다.계란이 뭔지 모르겠어요.

filepath_to/project_name/
    setup.py
    test_3.egg-info/
        dependency_links.txt
        PKG-INFO
        SOURCES.txt
        top_level.txt

이 폴더는 python 패키지로 간주되며 컴퓨터의 다른 위치에 스크립트를 작성하는 경우에도 이 상위 디렉터리의 파일에서 가져올 수 있습니다.

스텝 3. 위에서 Import

프로젝트의 메인 디렉토리와 서브 디렉토리의 2개의 파일을 작성한다고 합니다.다음과 같이 표시됩니다.

filepath_to/project_name/
    top_level_file.py
    subdirectory/
        subfile.py

    setup.py          |
    test_3.egg-info/  |----- Ignore these guys
        ...           |

만약 ,, 약top_level_file.py음음음같 뭇매하다

x = 1

수입하다에서 할 수 있어요.subfile.py또는 컴퓨터의 다른 위치에 있는 다른 파일도 마찬가지입니다.

# subfile.py  OR  some_other_python_file_somewhere_else.py

import random # This is a standard package that can be imported anywhere.
import top_level_file # Now, top_level_file.py works similarly.

print(top_level_file.x)

이것은 제가 찾던 것과는 다릅니다: 저는 python이 위의 파일에서 한 줄로 Import할 수 있기를 바랐습니다.대신 스크립트를 모듈처럼 취급하고 여러 개의 보일러 플레이트를 만들어 글로벌하게 설치해야 파이썬 설치 전체가 접근할 수 있습니다.그건 과잉 살상이야. 않는 사람이 ,importlib나니건 、 제제제제제

pathlib사용한 @alex-martelli의 세련된 답변:

import pathlib
import sys

_parentdir = pathlib.Path(__file__).parent.parent.resolve()
sys.path.insert(0, str(_parentdir))

import module_in_parent_dir

sys.path.remove(str(_parentdir))

python /myprogram/submodule/mymodule.py/myprogram/mainmodule.py via:

from mainmodule import *

Linux(를 들어 python Docker 이미지)에서는 프로그램 루트 디렉토리를 에 추가해야 했습니다.PYTHONPATH:

export PYTHONPATH=/myprogram

Python은 모듈식 시스템입니다.

Python은 파일 시스템에 의존하지 않습니다.

python 코드를 안정적으로 로드하려면 해당 코드를 모듈에 넣고 해당 모듈을 python 라이브러리에 설치합니다.

은 항상 할 수 .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을 하면 Python을 설치할 수 .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

.

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

foo_script.화이

#!/usr/bin/env python3

import bar
import foo

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

언급URL : https://stackoverflow.com/questions/1054271/how-to-import-a-python-class-that-is-in-a-directory-above

반응형