Python 3을 사용하여 Jupyter Notebook에서 상대적인 Import가 있는 다른 디렉토리에 있는 모듈에서 로컬 함수를 Import합니다.
다음과 유사한 디렉토리 구조를 가지고 있습니다.
meta_project
project1
__init__.py
lib
module.py
__init__.py
notebook_folder
notebook.jpynb
에서 notebook.jpynb
Import가 실행됩니다.function()
module.py
라이선스:
from ..project1.lib.module import function
다음의 에러가 표시됩니다.
SystemError Traceback (most recent call last)
<ipython-input-7-6393744d93ab> in <module>()
----> 1 from ..project1.lib.module import function
SystemError: Parent module '' not loaded, cannot perform relative import
상대 수입품을 사용해서 이것을 작동시킬 수 있는 방법이 있나요?
는 is음음음음음음음음음음음음 of of of of of 됩니다meta_project
디렉토리에서는, 그 파일에 있는 정보에 액세스 할 수 있습니다.
의 의도대로는, 「」라고 하는 점에 주의해 주세요.project1
에 '모듈'이 .__init__.py
파일 시스템 디렉토리로만 사용되었습니다.가 있는 , 문제 해결 방법에는 「」이 됩니다.__init__.py
파일(공백 파일도 가능)은 문제없지만, 그렇게 하는 것만으로는 문제를 해결할 수 없습니다.
저는 이 디렉토리를 머신 간에 공유하여 상대적인 Import를 통해 어디에서나 동일한 코드를 사용할 수 있습니다.또한 빠른 프로토타이핑을 위해 노트북을 사용하는 경우가 많기 때문에 절대적인 경로를 해킹하는 방법은 도움이 되지 않습니다.
편집: 이것은 일반적으로 Python 3에서의 상대적인 Import와 패키지 디렉토리 내에서 스크립트를 실행하는 것에 대해 이야기하는 Python 3에서의 상대적인 Import와는 다릅니다.이는 일반적인 측면과 특정 측면이 모두 다른 디렉토리의 로컬모듈에 있는 함수를 호출하려고 하는 주피터 노트북 내에서 작업하는 것과 관련이 있습니다.
저는 이 노트북에 당신과 거의 같은 예를 들어 인접 모듈의 기능 사용법을 DRY 방식으로 설명하고자 했습니다.
제 해결책은 다음과 같은 스니펫을 노트북에 추가하여 Python에게 추가 모듈 Import 경로를 알려주는 것이었습니다.
import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
sys.path.append(module_path)
이를 통해 모듈 계층에서 원하는 기능을 Import할 수 있습니다.
from project1.lib.module import function
# use the function normally
function(...)
.__init__.py
파일을 project1/ 및 lib/폴더(아직 없는 경우)에 저장합니다.
노트북에서 작업할 때 코드를 하위 모듈로 추상화하는 모범 사례를 찾아 여기에 왔습니다.베스트 프랙티스가 있는지 잘 모르겠어요.난 이걸 제안해왔어.
다음과 같은 프로젝트 계층:
├── ipynb
│ ├── 20170609-Examine_Database_Requirements.ipynb
│ └── 20170609-Initial_Database_Connection.ipynb
└── lib
├── __init__.py
└── postgres.py
★★★★★★★★★★★★★★★★★★★★로부터20170609-Initial_Database_Connection.ipynb
:
In [1]: cd ..
In [2]: from lib.postgres import database_connection
기능은 에서 "Pathyter Notebook", "Pathyter Notebook", "Pathyter Notebook", "Pathyter Notebook", "Pathyter Notebook", " Notebook"을 할 수 있기 입니다.cd
명령어를 입력합니다.Python 노트북 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」에 붙이지 않고 한다.%bash
프로젝트 주피터 도커 이미지 중 하나를 사용하여 도커에서 작업하는 100번 중 99번이라는 점을 고려하면 다음 수정은 무의미합니다.
In [1]: cd /home/jovyan
In [2]: from lib.postgres import database_connection
이 외의 모든 답변은 노트북에 코드를 추가하는 것에 의존합니다(!).
노트북 코드에 특정 경로를 하드코드하거나 위치에 따라 다르게 설정하는 것은 좋지 않은 방법이라고 생각합니다.이렇게 하면 나중에 코드 수정이 매우 어려워지기 때문입니다.대신 PythonPATH에 루트 프로젝트 폴더를 추가하는 것이 좋습니다.프로젝트 폴더로부터 직접 PYthonPATH 를 기동할 때,
env PYTHONPATH=`pwd` jupyter notebook
또는 다른 곳에서 시작하는 경우에는 절대 경로를 사용합니다.
env PYTHONPATH=/Users/foo/bar/project/ jupyter notebook
지금까지, 받아들여진 답변이 나에게 가장 효과적이었다. 제가 은, 그 에 대해, 제가 하는 도 모른다는 입니다.notebooks
「」의 이 .module_path
모든 노트북에 있습니다.필요한 모듈을 Import하기 위해 각 노트북 디렉토리에 python 파일을 추가하기로 했습니다.
따라서 다음과 같은 프로젝트 구조를 갖습니다.
project
|__notebooks
|__explore
|__ notebook1.ipynb
|__ notebook2.ipynb
|__ project_path.py
|__ explain
|__notebook1.ipynb
|__project_path.py
|__lib
|__ __init__.py
|__ module.py
했습니다.project_path.py
서브디렉토리각 노트북 서브디렉토리)에 .notebooks/explore
★★★★★★★★★★★★★★★★★」notebooks/explain
@metakermit(@metakermit) Import하다.
import sys
import os
module_path = os.path.abspath(os.path.join(os.pardir, os.pardir))
if module_path not in sys.path:
sys.path.append(module_path)
이 방법으로, 나는 단지 내에서의 상대적인 수입만 하면 된다.project_path.py
노트북에는 없습니다. 노트북 .project_path
전 »lib
를 들어, 를어 에는,0.0-notebook.ipynb
:
import project_path
import lib
여기서 주의할 점은 수입을 되돌리는 것은 효과가 없을 것이라는 것이다.이 조작은 동작하지 않습니다.
import lib
import project_path
따라서 수입 시 주의해야 합니다.
저는 방금 다음과 같은 멋진 해결책을 찾았습니다.
import sys; sys.path.insert(0, '..') # add parent folder path where lib folder is
import lib.store_load # store_load is a file on my library folder
당신은 단지 그 파일의 몇 가지 함수를 원할 뿐입니다.
from lib.store_load import your_function_name
python version > = 3.3인 경우 폴더에 init.py 파일이 필요하지 않습니다.
python-dotenv가 이 문제를 효과적으로 해결하는 데 도움이 된다는 것을 알게 되었습니다.프로젝트 구조는 약간 바뀌지만 노트북의 코드는 노트북 전체에서 좀 더 심플하고 일관성이 있습니다.
프로젝트의 경우는, 약간의 인스톨을 실시합니다.
pipenv install python-dotenv
다음으로 프로젝트 변경:
├── .env (this can be empty)
├── ipynb
│ ├── 20170609-Examine_Database_Requirements.ipynb
│ └── 20170609-Initial_Database_Connection.ipynb
└── lib
├── __init__.py
└── postgres.py
마지막으로 Import는 다음과 같이 변경됩니다.
import os
import sys
from dotenv import find_dotenv
sys.path.append(os.path.dirname(find_dotenv()))
이 패키지의 +1은 노트북의 깊이가 여러 디렉터리일 수 있다는 것입니다.python-dotenv는 부모 디렉토리에서 가장 가까운 디렉토리를 찾아 사용합니다.이 접근법의 +2는 부팅 시 주피터가 .env 파일에서 환경변수를 로드한다는 것입니다.이중고를.
이 토픽을 직접 알아보고 path.py 라이브러리를 사용하면 현재 작업 디렉토리를 변경할 수 있는 컨텍스트 매니저를 얻을 수 있으므로 권장되는 답변을 읽을 수 있습니다.
그리고 나서 당신은 다음과 같은 것을 갖게 된다.
import path
if path.Path('../lib').isdir():
with path.Path('..'):
import lib
하지만, 당신은 그냥 생략할 수 있습니다.isdir
진술.
여기에 인쇄문을 추가하여 상황을 쉽게 파악할 수 있도록 합니다.
import path
import pandas
print(path.Path.getcwd())
print(path.Path('../lib').isdir())
if path.Path('../lib').isdir():
with path.Path('..'):
print(path.Path.getcwd())
import lib
print('Success!')
print(path.Path.getcwd())
이 예에서는 출력(lib는/home/jovyan/shared/notebooks/by-team/data-vis/demos/lib
):
/home/jovyan/shared/notebooks/by-team/data-vis/demos/custom-chart
/home/jovyan/shared/notebooks/by-team/data-vis/demos
/home/jovyan/shared/notebooks/by-team/data-vis/demos/custom-chart
이 솔루션은 컨텍스트 매니저를 사용하기 때문에 커널이 셀 전에 어떤 상태였든 라이브러리 코드를 Import함으로써 어떤 예외가 발생하든 관계없이 이전 작업 디렉토리로 돌아갈 수 있습니다.
나만큼 솔루션을 이해하지 못하는 사용자는 특정 문제에 대해 필요한 만큼 디렉토리를 자세히 살펴봐야 합니다.이 오류에 대한 해결 방법:
이름이 'your_folder'인 모듈이 없습니다.
작업 중인 노트북은 다음 위치에 있습니다.
C:\Users\vojte\projects\predicta\EDA\apartments\EDA.ipynb
이 노트북을 Import합니다.
C:\Users\vojte\projects\functions\functions.ipynb
위의 솔루션을 @metakermit에서 이 솔루션으로 수정해야 했습니다.
import os
import sys
module_path = os.path.abspath(os.path.join('..\..\..'))
if module_path not in sys.path:
sys.path.append(module_path)
from functions import functions as f
확인하실 수 있습니다.sys.path
를 참조해 주세요.이 예에서는 다음 행이 추가되었습니다.
C:\\Users\\vojte\\projects
@joshua-cook의 사용 답변 개선cd..
셀을 재실행하지 않았는지, 또, 사용중에 디렉토리를 망가뜨리지 않았는지 확인합니다.run all
없이.restart
대신 다음 코드를 사용합니다.
if 'NOTEBOOK_INITIATED_FLAG' not in globals():
NOTEBOOK_INITIATED_FLAG = True
%cd ..
%pwd
NOTEBOOK_INITIATED_FLAG
는 커널이 이미 실행 중임을 나타내는 플레이스 홀더로 사용되므로 디렉토리를 변경할 필요가 없습니다.
그리고 이건 슈퍼 컴플렉스 보일러 플레이트입니다.jupytext
를 실행해 주세요..py
상위 폴더의 파일:
import os
import sys
if 'NOTEBOOK_INITIATED_FLAG' not in globals():
NOTEBOOK_INITIATED_FLAG = True
try:
# not in notebook
module_path = os.path.join(os.path.dirname(__file__), os.pardir)
except:
# in notebook
module_path = os.path.abspath(os.path.join('..'))
%cd ..
%pwd
if module_path not in sys.path:
sys.path.append(module_path)
여기 2센트 있습니다.
import sys
# map the path where the module file is located. In my case it was the desktop
sys.path.append('/Users/John/Desktop')
# Either import the whole mapping module BUT then you have to use the .notation to map the classes like mapping.Shipping()
import mapping #mapping.py is the name of my module file
shipit = mapping.Shipment() #Shipment is the name of the class I need to use in the mapping module
# Or import the specific class from the mapping module
from mapping import Mapping
shipit = Shipment() #Now you don't have to use the .notation
언급URL : https://stackoverflow.com/questions/34478398/import-local-function-from-a-module-housed-in-another-directory-with-relative-im
'programing' 카테고리의 다른 글
i18n을 사용한vue 3 vite의 국제화 (0) | 2022.11.14 |
---|---|
Python을 사용하여 텍스트 파일을 목록 또는 배열로 읽는 방법 (0) | 2022.11.14 |
Vanilla JavaScript vs. jQuery를 사용하는 경우 (0) | 2022.11.14 |
express req 객체를 사용하여 요청 경로를 가져오는 방법 (0) | 2022.11.13 |
문자열의 선두에서 문자열을 제거합니다. (0) | 2022.11.13 |