Python 2.5를 실행 중입니다.
이것은 내 폴더 트리입니다.
ptdraft/
nib.py
simulations/
life/
life.py
(또한 __init__.py
각 폴더에는 가독성을 위해 생략했습니다)
nib
모듈 내부에서 life
모듈을 가져 오려면 어떻게합니까 ? sys.path로 땜질하지 않고 할 수 있기를 바랍니다.
참고 : 실행중인 기본 모듈은 ptdraft
폴더에 있습니다.
답변
문제는 상위 디렉토리에있는 모듈 또는 이와 유사한 것과 관련이없는 것 같습니다.
ptdraft
PYTHONPATH에 포함 된 디렉토리를 추가해야합니다.
당신은 당신 import nib
과 함께 일 했다고 말했을 것입니다 ptdraft
.
답변
상대 가져 오기를 사용할 수 있습니다 (python> = 2.5).
from ... import nib
(Python 2.5의 새로운 기능) PEP 328 : 절대 및 상대 수입
편집 : 다른 점 ‘.’을 추가했습니다. 두 개의 패키지를 올리다
답변
에서와 같이 상대적 가져 오기 from .. import mymodule
는 패키지에서만 작동합니다. 현재 모듈의 상위 디렉토리에있는 ‘mymodule’을 가져 오려면 다음을 수행하십시오.
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
import mymodule
편집 : __file__
속성이 항상 제공되는 것은 아닙니다. 사용하는 대신 os.path.abspath(__file__)
이제 inspect 모듈을 사용하여 현재 파일의 파일 이름 및 경로를 검색하는 것이 좋습니다.
답변
형제 패키지에서 가져온 수입품에 관한 질문에도 비슷한 답변을 게시했습니다. 여기서 볼 수 있습니다 .
sys.path
해킹 없는 솔루션
요약
- (예를 들어 하나 개의 폴더에 코드를 바꿈
packaged_stuff
) - setuptools.setup ()
setup.py
을 사용하는 스크립트 작성을 사용하십시오 . - 편집 가능한 상태로 패키지를 핍 설치
pip install -e <myproject_folder>
- 를 사용하여 가져 오기
from packaged_stuff.modulename import function_name
설정
질문에서와 동일한 폴더 구조를 가정합니다.
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
.
루트 폴더를 호출하고 제 경우에는에 있습니다 C:\tmp\test_imports
.
단계
1) setup.py
루트 폴더에 추가
내용은 setup.py
간단하게
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
기본적으로 “모든” setup.py
이 작동합니다. 이것은 최소한의 실례입니다.
2) 가상 환경 사용
가상 환경에 익숙한 경우 가상 환경을 활성화하고 다음 단계로 건너 뜁니다. 가상 환경에서의 사용은하지 않는 절대적으로 필요하지만 그들은 것 정말 장기적으로 당신을 도울 (당신이 진행하는 1 개 이상의 프로젝트가있을 때 ..). 가장 기본적인 단계는 (루트 폴더에서 실행)
- 가상 환경 생성
python -m venv venv
- 가상 환경 활성화
. /venv/bin/activate
(Linux) 또는./venv/Scripts/activate
(Win)
이에 대한 자세한 내용은 “python virtualenv 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>
3) 프로젝트를 편집 가능한 상태로 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
4) mainfolder
모든 수입 에 앞서 수입
이 예에서는 mainfolder
입니다 ptdraft
. 이것은 다른 모듈 이름 (python 표준 라이브러리 또는 타사 모듈에서)과 이름 충돌이 발생하지 않는 이점이 있습니다.
사용법 예
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
life.py 실행
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
답변
sys.path에 나열된 “모듈 검색 경로”에서 경로에 따라 OS를 사용할 수 있습니다 . 따라서 다음과 같이 쉽게 상위 디렉토리를 추가 할 수 있습니다
import sys
sys.path.insert(0,'..')
부모-부모 디렉토리를 추가하려면
sys.path.insert(0,'../..')
이것은 파이썬 2와 3에서 모두 작동합니다.
답변
PYTHONPATH에 모듈 폴더를 추가하는 작업을하지 않은 경우에는 수정할 수 있습니다 sys.path에의 수입에 모듈에 대한 파이썬 인터프리터를 검색의 경우 프로그램에서 목록을 파이썬 문서 말한다 :
스팸 이라는 모듈을 가져 오면 인터프리터는 먼저 해당 이름의 내장 모듈을 검색합니다. 찾을 수 없으면 sys.path 변수가 제공 한 디렉토리 목록에서 spam.py 라는 파일을 검색합니다 . sys.path는 다음 위치에서 초기화됩니다.
- 입력 스크립트가 들어있는 디렉토리 (또는 현재 디렉토리)
- PYTHONPATH (쉘 변수 PATH와 동일한 구문을 가진 디렉토리 이름 목록)
- 설치에 따른 기본값
초기화 후에 파이썬 프로그램은 sys.path 를 수정할 수 있습니다 . 실행중인 스크립트가 포함 된 디렉토리는 표준 라이브러리 경로보다 검색 경로의 시작 부분에 있습니다. 이는 해당 디렉토리의 스크립트가 라이브러리 디렉토리에 동일한 이름의 모듈 대신로드됨을 의미합니다. 교체를 의도하지 않는 한 오류입니다.
이것을 알고 있으면 프로그램에서 다음을 수행 할 수 있습니다.
import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')
# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft
답변
파이썬 2에 대해 잘 모릅니다
. 파이썬 3에서는 다음과 같이 상위 폴더를 추가 할 수 있습니다.
import sys
sys.path.append('..')
… 그리고 모듈에서 모듈을 가져올 수 있습니다