[python] 상위 폴더에서 모듈 가져 오기

Python 2.5를 실행 중입니다.

이것은 내 폴더 트리입니다.

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(또한 __init__.py각 폴더에는 가독성을 위해 생략했습니다)

nib모듈 내부에서 life모듈을 가져 오려면 어떻게합니까 ? sys.path로 땜질하지 않고 할 수 있기를 바랍니다.

참고 : 실행중인 기본 모듈은 ptdraft폴더에 있습니다.



답변

문제는 상위 디렉토리에있는 모듈 또는 이와 유사한 것과 관련이없는 것 같습니다.

ptdraftPYTHONPATH에 포함 된 디렉토리를 추가해야합니다.

당신은 당신 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('..')

… 그리고 모듈에서 모듈을 가져올 수 있습니다