sys.path 해킹에 지쳤습니까?
sys.path.append
사용 가능한 많은 해킹이 있지만 문제를 해결하는 다른 방법을 찾았습니다.
요약
- (예를 들어 하나 개의 폴더에 코드를 바꿈
packaged_stuff
)
- setuptools.setup ()
setup.py
을 사용하는 스크립트 작성을 사용하십시오 .
- 편집 가능한 상태로 패키지를 핍 설치
pip install -e <myproject_folder>
- 를 사용하여 가져 오기
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!'
test_one.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 <module>
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 <module>
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())
- 가상 환경 사용
가상 환경에 익숙한 경우 가상 환경을 활성화하고 다음 단계로 건너 뜁니다. 가상 환경에서의 사용은하지 않는 절대적으로 필요하지만 그들은 것 정말 장기적으로 당신을 도울 (당신이 진행하는 1 개 이상의 프로젝트가있을 때 ..). 가장 기본적인 단계는 (루트 폴더에서 실행)
- 가상 환경 생성
- 가상 환경 활성화
source ./venv/bin/activate
(Linux, macOS) 또는 ./venv/Scripts/activate
(Win)
이에 대한 자세한 내용은 "python virtual env tutorial"또는 유사 항목을 Google에 알려주십시오. 작성, 활성화 및 비활성화 이외의 다른 명령은 필요하지 않습니다.
가상 환경을 만들고 활성화하면 콘솔은 가상 환경의 이름을 괄호 안에 표시해야합니다
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
. 트릭은 -e
설치를 수행 할 때 플래그 를 사용하는 것 입니다. 이렇게하면 편집 가능한 상태로 설치되고 .py 파일에 대한 모든 편집 내용이 설치된 패키지에 자동으로 포함됩니다.
루트 디렉토리에서 다음을 실행하십시오.
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
myproject.
수입품에 추가
myproject.
그렇지 않으면 작동하지 않는 가져 오기에만 추가해야합니다 . setup.py
& 없이 pip install
작동 하는 수입품은 여전히 잘 작동합니다. 아래 예를 참조하십시오.
솔루션 테스트
이제 api.py
위에서 test_one.py
정의하고 아래 정의 된 방법을 사용하여 솔루션을 테스트하겠습니다 .
test_one.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 문서 를 참조하십시오 .
** 실제로, 가상 환경을 하드 디스크의 어느 곳에 나 둘 수 있습니다.
sys.path
해킹을 건너 뛰고 지금까지 게시 된 유일한 실제 솔루션 (7 년 후)을 읽는 것이 좋습니다 .