스택큐힙리스트

형제 관련 패키지 불러오기 본문

카테고리 없음

형제 관련 패키지 불러오기

스택큐힙리스트 2023. 4. 23. 03:13
반응형

저는 sibling imports에 관한 질문들을 읽어봤고 심지어 package documentation을(를) 찾아보았지만 아직도 답을 찾지 못했습니다.

번역하기:

다음 구조로 번역해주세요:

- Greetings

- Introduction

- Body of message

- Closing or conclusion statement

- Signature

├── LICENSE.md

├── README.md

├── api

│   ├── __init__.py

│   ├── api.py

│   └── api_key.py

├── examples

│   ├── __init__.py

│   ├── example_one.py

│   └── example_two.py

└── tests

│   ├── __init__.py

│   └── test_one.py

examples와 tests 디렉토리에 있는 스크립트들은 어떻게 api 모듈을 import하고 commandline에서 실행할 수 있나요?

또한, 매 파일마다 sys.path.insert 더럽고 추해 보이는 해킹 방식을 피하고 싶습니다. 파이썬으로 이것을 해결할 수 있을 것 같은데 말이죠?

답변 1

sys.path 해킹에 지쳤나요?

sys.path.append -해킹 방법은 많이 있지만, 나는 다른 해결 방법을 찾아 냈습니다.

요약

코드를 한 폴더에 포장하세요 (예: packaged_stuff).

tuptools.setup() . (se를 사용하는 최소한의 setup.py 스크립트를 작성하십시오.

pip install -e 와 함께 수정 가능한 상태로 패키지를 설치하세요.

from packaged_stuff.modulename import function_name 를 사용하여 가져오세요.

설정

시작점은 myproject이라는 폴더에 포장된 제공한 파일 구조입니다.

.

└── myproject

├── api

│ ├── api_key.py

│ ├── api.py

│ └── __init__.py

├── examples

│ ├── example_one.py

│ ├── example_two.py

│ └── __init__.py

├── LICENCE.md

├── README.md

└── tests

├── __init__.py

└── test_one.py

나는 . 를 루트 폴더라고 부르겠으며, 나의 예제 케이스에서 그것은 C:\tmp\test_imports\ 에 위치해 있습니다.

api.py

시험 케이스로 다음의 ./api/api.py를 사용해 봅시다.

def function_from_api():

return 'I am the return value from api.api!'

테스트_원.py

from api.api import function_from_api

def test_function():

print(function_from_api())

if __name__ == '__main__':

test_function()

test_one를 실행해보세요.

PS C:\tmp\test_imports> python .\myproject\tests\test_one.py

Traceback (most recent call last):

File .\myproject\tests\test_one.py, line 1, in

from api.api import function_from_api

ModuleNotFoundError: No module named 'api'

상대적인 가져오기도 시도하지 마십시오:

from ..api.api import function_from_api을(를) 사용하면 결과적으로 다음과 같습니다.

PS C:\tmp\test_imports> python .\myproject\tests\test_one.py

Traceback (most recent call last):

File .\tests\test_one.py, line 1, in

from ..api.api import function_from_api

ValueError: attempted relative import beyond top-level package

단계

루트 레벨 디렉터리에 setup.py 파일을 만드세요.

setup.py에 대한 내용은 다음과 같습니다.

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages())

가상 환경을 사용하세요.

가상 환경에 익숙하시면 활성화하고 다음 단계로 이동하십시오. 가상 환경을 사용하는 것은 필수가 아니지만, 오랜 기간에 걸쳐 여러 프로젝트를 진행할 경우 실제로 큰 도움이 됩니다. 가장 기본적인 단계는 (루트 폴더에서 실행)

가상 환경 만들기

python -m venv venv

가상 환경 활성화하기

해당 문장은 알파벳과 기호의 조합으로 이루어져 있으며 의미가 없는 문자열입니다. 따라서 번역이 불가능합니다.

이에 대해 더 알아보려면 파이썬 가상환경 튜토리얼 또는 유사한 것을 구글에서 검색해보세요. 아마 생성, 활성화 및 비활성화 외에는 다른 명령을 사용할 일이 없을 것입니다.

가상 환경을 만들고 활성화한 후, 콘솔에서는 괄호 안에 가상 환경 이름이 표시됩니다.

PS C:\tmp\test_imports> python -m venv venv

PS C:\tmp\test_imports> .\venv\Scripts\activate

(venv) PS C:\tmp\test_imports>

그리고 당신의 폴더 트리는 이렇게 보여야 합니다**

.

├── myproject

│ ├── api

│ │ ├── api_key.py

│ │ ├── api.py

│ │ └── __init__.py

│ ├── examples

│ │ ├── example_one.py

│ │ ├── example_two.py

│ │ └── __init__.py

│ ├── LICENCE.md

│ ├── README.md

│ └── tests

│ ├── __init__.py

│ └── test_one.py

├── setup.py

└── venv

├── Include

├── Lib

├── pyvenv.cfg

└── Scripts [87 entries exceeds filelimit, not opening dir]

편집 가능한 상태로 프로젝트를 설치하려면 pip를 사용하세요.

myproject을(를) 사용하여 상위 레벨 패키지를 설치하십시오. 설치할 때 pip를 사용하는 것이 핵심입니다. 이렇게하면 편집 가능한 상태로 설치되며, .py 파일에 대한 모든 편집 내용이 자동으로 설치된 패키지에 포함됩니다. -e 플래그를 사용하세요.

루트 디렉토리에서 다음을 실행하세요.

pip install -e . (점에 주목하십시오. 이것은 현재 디렉토리를 나타냅니다)

당신은 pip freeze를 사용하여 설치되었음을 확인할 수도 있습니다.

(venv) PS C:\tmp\test_imports> pip install -e .

Obtaining file:///C:/tmp/test_imports

Installing collected packages: myproject

Running setup.py develop for myproject

Successfully installed myproject

(venv) PS C:\tmp\test_imports> pip freeze

myproject==1.0

당신의 imports에 myproject.를 추가하십시오.

myproject.을 가져와야 작동하지 않는 가져오기에만 추가해야한다는 것을 유의하세요. setup.py 와 pip install를 사용하지 않아도 작동하는 가져오기는 여전히 잘 작동합니다. 아래 예제를 참조하세요.

해결책을 테스트하십시오.

이제 위에서 정의한 api.py와 아래에서 정의한 test_one.py를 사용하여 솔루션을 테스트해 봅시다.

테스트_원.py

from myproject.api.api import function_from_api

def test_function():

print(function_from_api())

if __name__ == '__main__':

test_function()

테스트 실행 중입니다.

(venv) PS C:\tmp\test_imports> python .\myproject\tests\test_one.py

I am the return value from api.api!

더 자세한 setup.py 예제는 setuptools docs를 참조하세요.

실제로 가상 환경을 하드 디스크 어디에든 위치시킬 수 있습니다.

답변 2

특정 프로그래밍 언어에서 라이브러리는 특정 폴더에 패키지로 저장됩니다. 이러한 패키지를 다른 프로젝트에서 재사용하려면 정확한 패키지 경로를 지정해야 합니다. 그러나 형제 패키지를 사용하면 같은 폴더에 있는 다른 패키지를 간단하게 가져올 수 있습니다.

형제 패키지는 같은 부모 폴더를 공유하는 두 개 이상의 패키지를 가리킵니다. 이 패키지들은 서로 연결되어 있고 사용자가 패키지를 찾는 경로를 절약할 수 있게 됩니다. 형제 패키지를 사용하면 코드 작성 시간을 절약하고 가독성을 높일 수 있습니다.

파이썬에서 형제 패키지는 하나의 프로젝트 내에서 다른 패키지를 가져와 사용할 수 있습니다. 이는 지금까지 필요한 패키지가 프로젝트의 루트 폴더에 있지 않더라도 사용할 수 있게 합니다. 형제 패키지를 사용하면 이전보다 더 효율적으로 코드를 작성할 수 있으며, 코드를 유지보수하기 쉬워집니다.

결론적으로, 형제 패키지 임포트는 프로젝트에서 필요한 패키지를 빠르고 쉽게 가져오는 방법입니다. 또한 코드를 더 쉽게 읽고 유지 보수하기 쉽게 만듭니다. 따라서 개발자들은 형제 패키지를 효과적으로 사용하여 코드 작성 프로세스를 개선할 수 있습니다.

반응형
Comments