위의 디렉토리에 있는 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.py
py 할 수 있기 , 모든 의 변경할 수 를 들어, 「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 foo
foo/__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
'programing' 카테고리의 다른 글
여러 Python 버전과 PIP를 다루고 있습니까? (0) | 2022.10.30 |
---|---|
그룹화된 결과의 각 그룹에 대해 상위 n개의 레코드를 가져옵니다. (0) | 2022.10.30 |
파이프에서 'subprocess' 명령어를 사용하는 방법 (0) | 2022.10.30 |
JavaScript 문자열 암호화 및 암호 해독 (0) | 2022.10.30 |
업데이트된 vuex 상태에 대한 vue 수명 주기 방법 (0) | 2022.10.30 |