[python] 위의 디렉토리에있는 Python 클래스를 가져 오는 방법은 무엇입니까?
현재 디렉토리 위의 디렉토리에있는 파일의 클래스에서 상속하고 싶습니다.
해당 파일을 상대적으로 가져올 수 있습니까?
답변
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 은 절대 / 상대 수입을 다룹니다.
답변
import sys
sys.path.append("..") # Adds higher directory to python modules path.
답변
그가 언급 한 패키지 계층 구조를 보장 할 수 있다면 @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
답변
현재 디렉토리보다 정확히 한 수준 높은 디렉토리에서 모듈을 가져옵니다.
from .. import module
답변
디렉토리 인 모듈을로드하는 방법
서문 : 사람들을 파이썬 생태계로 편하게 데려다 줄 것이라는 희망으로 이전 답변을 상당 부분 다시 작성했으며 모든 사람들에게 파이썬의 수입 시스템으로 성공의 최고의 변화를주기를 바랍니다.
이것은 패키지 내의 상대적 수입 을 다루며 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
답변
파이썬은 모듈 식 시스템입니다
파이썬은 파일 시스템에 의존하지 않습니다
파이썬 코드를 안정적으로로드하려면 해당 코드를 모듈에 넣고 해당 모듈을 파이썬 라이브러리에 설치하십시오.
설치된 모듈은 항상 최상위 네임 스페이스에서로드 할 수 있습니다. 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))