개발하자

주피터 노트북의 다른 디렉토리에 py 파일 가져오기

Cuire 2023. 10. 10. 07:20
반응형

주피터 노트북의 다른 디렉토리에 py 파일 가져오기

제 질문은 에 관한 것입니다. 저는 주피터 노트북에서 파이썬 3.6을 사용하고 있습니다. 저의 프로젝트 디렉토리는. 이 디렉토리에서 나는 여러 모델을 만들고 있으며 각각의 폴더가 있습니다. 하지만 모든 모델에 걸쳐 사용하고 싶은 기능이 있는 공통 파일이 있습니다. 그래서 나는 파일을 보관하고 싶지만 , 등의 파일에서 호출할 수 있기를 원한다... 이거 어떻게 해요?




나는 답이 마음에 들지 않아서 이 문제에 대해 생각해왔다. 내가 제안하는 해결책은 내장된 주피터 마법 명령어를 사용하여 현재 작업 디렉토리를 변경한다. 다음과 같은 파일 구조를 가진다고 가정하면:

project
├── model1
|   └── notebook1.ipynb
├── model2
|   └── notebook2.ipynb
└── functions.py

또는 에서 가져올지 여부에 관계없이 패키지를 가져온 셀 앞에 다음 행이 있는 셀을 추가하기만 하면 됩니다:

%cd ..

이것은 현재 작업 디렉토리를 노트북의 부모 디렉토리로 변경하고, 이것은 Python이 패키지를 검사할 기본 위치에 함수 모듈의 경로를 추가한다. 가져오려면:

import functions

가져오기를 원하는 동일한 패키지 디렉토리에 여러 개의 모듈이 있는 경우에도 마찬가지로 작동합니다:

project
├── model1
|   └── notebook1.ipynb
├── model2
|   └── notebook2.ipynb
└── package
    ├── functions1.py
    └── functions2.py 

다음과 같이 모듈과 모듈을 모두 가져올 수 있습니다:

from package import functions1, functions2

편집: 아래에 지적된 바와 같이 마법 명령이 포함된 셀을 두 번 이상 실행하면 로컬 가져오기가 더 이상 작동하지 않습니다(명령을 다시 실행할 때마다 현재 작업 디렉토리가 위의 디렉토리로 변경됩니다). 이를 방지하려면 명령어가 노트북 상단의 자체 셀(가져오는 셀과 동일한 셀이 아닌)에 있어야 하며 여러 번 실행되지 않습니다. 커널을 다시 시작하고 모든 셀을 실행하면 현재 작업 디렉토리가 재설정되지만 원하는 가져오기/결과는 여전히 반환됩니다.




파이썬 파일을 다른 디렉터리로 가져올 수 있는 간단한 방법은 없다. 이것은 주피터 공책과는 무관하다

다음은 당신의 문제에 대한 3가지 해결책입니다

  1. 가져올 파일이 들어 있는 디렉토리를 경로에 추가한 다음 다음과 같이 파일을 가져올 수 있습니다:
import sys  
sys.path.insert(1, '/path/to/application/app/folder')

import file
  1. 가져올 폴더에 빈 파일이 있으면 로컬 모듈을 만들 수 있습니다. 폴더 계층과 관련하여 고려해야 할 사항이 몇 가지 있습니다.

  2. 가져올 파일에 대한 모듈을 생성하여 전역적으로 설치할 수 있습니다.




가상 환경에 패키지로 설치하는 것을 제안합니다. 다음과 같은 이점이 있습니다:

  1. 특정 환경(커널)에 있는 모든 iPython 노트북에서 파일에 액세스할 수 있습니다.
  2. 파일의 기능을 변경하면 iPython 노트북을 몇 번이고 다시 로드할 필요가 없습니다. 변경할 때마다 자동으로 다시 로드됩니다.

이렇게 하면 다음과 같이 할 수 있습니다:

  • 프로젝트 폴더에 파일() 만들기
  • 가상 환경을 활성화하고 프로젝트 위치로 이동한 후 이 명령을 사용합니다
  • 그러면 iPython 노트북에서 다음을 수행합니다:

    %load_ext autoreload

    %자동 로드 1

    %a이(가) 프로젝트를 가져옵니다.기능들

    함수 가져오기 *에서

그거야!




폴더 이름이 있고 이름이 다른 폴더에서 모듈(직원)을 가져오려는 경우.

시각화:

enter image description here

다음 작업을 수행합니다:

import sys
import os

module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
    sys.path.append(module_path+"\\nn_webserver")

from employee import motivation_to_work

@metakermit에서 추가 정보 보기




OP와 정확한 상황에 처해 있다는 것을 알게 되었고, 여러 노트를 만들 것이므로 다른 하위 폴더에 정리하고 싶다

내가 필요로 하는 것처럼 보이고 내가 더 깨끗해 보이는 이것을 시도해 보았다

import os
os.chdir(os.path.dirname(os.path.dirname(os.getcwd())))

내 함수가 두 단계 위에 있으므로 중첩된 두 개(폴더 구조가 서로 다른 경우 하나 이상일 수 있음)

방금 구현했고 잘 작동하고 있어요. 그런데 주피터랩을 사용하고 있어요... 그 기능이 있는 곳에서 두 단계 위에




나는 과거에 노트북이 위치한 디렉터리에 모듈이 올바른 경로에 있는 것처럼 파이썬이 위치하도록 로드하려는 라이브러리에 기호 링크를 만들어 이 문제를 해결한 적이 있다. 위의 예에서는 셀 내부에서 다음 명령을 실행합니다:

!ln -s /user/project/functions.py functions.py

그리고 나서 당신은 수입할 수 있을거에요

import functions

참고: 저는 이것을 리눅스와 맥 오즈에서만 시도해보았으므로 윈도우를 보증할 수 없습니다.




adhg의 답변 외에도 리눅스/윈도우/WSL 경로 형식 간의 호환성을 위해 패스립을 사용하는 것을 추천합니다:

다음과 같은 폴더 구조를 가정합니다:

.
├── work
|   ├── notebook.ipynb
|   └── my_python_file.py
├── py
|   ├──modules
|   |    ├──__init__.py # empty
|   |    └──preparations.py
|   ├──__init__.py # empty
|   └── tools.py
├──.git
└── README.md

로드하거나 노트북에 로드하려면:

import sys
from pathlib import Path

# in jupyter (lab / notebook), based on notebook path
module_path = str(Path.cwd().parents[0] / "py")
# in standard python
module_path = str(Path.cwd(__file__).parents[0] / "py")

if module_path not in sys.path:
    sys.path.append(module_path)

from modules import preparations
import tools
...



또한 주피터 노트에서 실행 마법을 사용할 수도 있다.

%run -i "<filepath/functions.py>"

그것은 기본적으로 다음과 같이 운영된다

from functions.py import *



또 다른 해결책은 IPython 커널 환경 변수를 변경하는 것이다. 이 솔루션의 장점은 항상 동일한 커널로 작업하는 경우, 추가할 필요가 없다는 것입니다

이 솔루션은 다음을 기반으로 합니다

노트북에서 사용하는 IPython 커널이 라고 하자.

연결된 파일을 찾으려면 터미널에서 실행합니다:

jupyter kernelspec list

다음과 유사한 출력을 얻을 수 있습니다:

Available kernels:
  python3                 <path1>/share/jupyter/kernels/python3
  venv1    <path2>/.local/share/jupyter/kernels/venv1
  python2                 /usr/local/share/jupyter/kernels/python2

이제 와 관련된 경로에서 파일을 찾을 수 있습니다. 텍스트 편집기로 열어 봅니다. 예를 들어 다음과 같이 열 수 있습니다:

gedit <path2>/.local/share/jupyter/kernels/venv1/kernel.json

이와 유사한 파일을 찾아야 합니다:

{
 "argv": [
  "/homes/<user>/.conda/envs/venv/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python (venv1)",
 "language": "python",
 "metadata": {
  "debugger": true
 }
}

키 "env" ()로 새 사전을 추가하여 환경 변수를 설정할 수 있으므로 모듈을 가져올 디렉토리에 추가할 수 있습니다. 예를 들어 다음과 같이 파일을 변경합니다("env" 앞의 ',"를 잊지 마십시오):

{
 "argv": [
  "/homes/shaigu/.conda/envs/panoptic_match_gtoii/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python (panoptic_match_gtoii)",
 "language": "python",
 "metadata": {
  "debugger": true
 },
 "env": {"PYTHONPATH": "${PYTHONPATH}:/user/project"}
}

반응형