programing

__file__이(가) 주피터 노트북에 없습니다.

stoneblock 2023. 5. 14. 10:03

__file__이(가) 주피터 노트북에 없습니다.

파이썬 3.4.2가 설치된 주피터 노트북 서버(v4.2.2)에 있으며 글로벌 이름을 사용하고 싶습니다.__file__노트북이 다른 사용자로부터 복제되고 한 섹션에서 실행해야 하기 때문입니다.

def __init__(self, trainingSamplesFolder='samples', maskFolder='masks'):
    self.trainingSamplesFolder = self.__getAbsPath(trainingSamplesFolder)
    self.maskFolder = self.__getAbsPath(maskFolder)

def __getAbsPath(self, path):
    if os.path.isabs(path):
        return path
    else:
        return os.path.join(os.path.dirname(__file__), path)

__getAbsPath(self, path)확인합니다.pathparam은 상대 경로 또는 절대 경로이며 의 절대 버전을 반환합니다.path그래서 나는 반환된 것을 사용할 수 있습니다.path무사히 나중에

하지만 나는 오류를 이해합니다.

이름 오류: 이름'__file__'정의되지 않음

온라인에서 이 오류를 검색하여 더 잘 사용해야 하는 "해결책"을 찾았습니다.sys.argv[0],그렇지만print(sys.argv[0])돌아온다

/usr/local/lib/python3.4/dist-packages/ipykernel/__main__.py

하지만 올바른 노트북 위치는/home/ubuntu/notebooks/.

참고 자료 감사합니다. Martjn Pieters에서 현재 IPython 노트북 이름을 얻는 방법(댓글) 마지막 답변(승인되지 않음)이 제 요구에 완벽하게 들어맞습니다.

print(os.getcwd())

/집/집/집/집

스크립트가 실행 중인 디렉터리의 경로를 가져오려면 다음을 사용하는 것이 좋습니다.

os.path.abspath('')

이점

  • 주피터 노트북에서 작동합니다.
  • REPL에서 작동합니다.
  • Python 3.4의 pathlib이 필요하지 않습니다.

참고로 한 가지 시나리오는 다음과 같습니다.__file__이점은 디렉토리 A에서 python을 호출하지만 디렉토리 B에서 스크립트를 실행하는 경우입니다.이 경우 위와 같은 대부분의 다른 방법은 B가 아닌 A를 반환합니다.그러나 주피터가 예약하지 않은 경우, 당신은 항상 다음과 같은 폴더를 얻습니다..ipyn시작한 디렉터리 대신 파일을 사용합니다.jupyter notebook.

__file__사용할 수 없을 수도 있지만 실제로는 노트북이 위치한 현재 폴더를 가져올 수 있습니다.

글로벌 변수에 추적이 있습니다.globals()키에 요소가 있다는 것을 알게 될 것입니다._dh도움이 될 수도 있습니다.로드 방법은 다음과 같습니다.data.csv내 노트북과 동일한 폴더에 있는 파일:

import os

current_folder = globals()['_dh'][0]

# Calculating path to the input data
data_location = os.path.join(current_folder,'data.csv')

현대의 파이썬(v3.4+)에서는 pathlib를 사용하여 노트북의 디렉터리를 가져올 수 있습니다.

from pathlib import Path

cwd = Path().resolve()
# cwd == PosixPath('/path/to/this/jupyter/ipynb/file's/directory/')

# or this way, thanks @NunoAndré:
cwd = Path.cwd()
# cwd == PosixPath('/path/to/this/jupyter/ipynb/file's/directory/')



갱신하다

@ShitalShah 저는 당신이 보고하는 오류를 재현할 수 없습니다.주피터 노트북은 응용 프로그램이 시작된 현재 작업 디렉터리에 상관없이 잘 작동하는 것 같습니다.

예: 파일~/dir1/dir2/untitled.ipynb그리고 주피터 공책은~/dir1:

주피터 노트북이 ~/dir1에서 시작되었습니다.

주피터 노트는 다음에서 시작되었습니다.~/dir1/dir2:

주피터 노트북은 ~/dir1/dir2에서 시작되었습니다.

노트북에 대한 경로를 찾을 수 없습니다.하나의 환경에서만 작동하는 솔루션을 얻을 수 있습니다(예:os.getcwd()하지만 노트북이 다른 방식으로 로드된 경우에는 작동하지 않습니다.

대신, 노트북이 자신의 경로를 알 필요가 없도록 노트를 작성하도록 합니다.pwd를 얻는 것과 같은 일을 하는 경우, 이것이 작동하지 않으면 빨리 실패하거나 오류를 인쇄해야 합니다. 단지 묵묵히 계속하려고 하는 것이 아니라.

참고 항목: https://github.com/ipython/ipython/issues/10123

및 Python의 __file__작업...이전 버전이 있는 경우 다음과 같이 하십시오.__file__사용할 수 있습니다.

import inspect
from pathlib import Path

module_path = Path(inspect.getframeinfo(inspect.currentframe()).filename).resolve()

하지만... 이건 훨씬 느립니다...반면에 모듈을 다른 곳에서 가져오더라도 현재 작업 디렉터리가 아닌 모듈에 대한 경로를 반환합니다.

저는 파이썬은 처음이지만, 이것은 저에게 효과가 있습니다.

얻을 수 있습니다.os.path.dirname(__file__)동등성:

sys.path[0]

주피터 노트북의 경우 파일을 따옴표(: "file")로 묶습니다.그런 다음 dirname 방법을 사용하여 파일 DIR을 가져옵니다.

import os

THIS_DIR = os.path.dirname(os.path.abspath("__file__"))
print(THIS_DIR)

# /home/brightkoech/Projects/EPL-Streamlit-Visualisation/src

언급URL : https://stackoverflow.com/questions/39125532/file-does-not-exist-in-jupyter-notebook