__file__ 在 Jupyter Notebook 中不存在

新手上路,请多包涵

我在使用 Python 3.4.2 的 Jupyter 笔记本 服务器 (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) 检查 path 参数是相对路径还是绝对路径,并返回 path 的绝对版本。所以我可以稍后安全地使用返回的 path

但我得到了错误

NameError:名称 '__file__' 未定义

我在网上搜索了这个错误,找到了我应该更好地使用 sys.argv[0] 的“解决方案”,但是 print(sys.argv[0]) 返回

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

但正确的笔记本位置应该是 /home/ubuntu/notebooks/

感谢您的参考 _如何从 Martijn Pieters 获取当前的 IPython Notebook 名称_(评论)最后的答案(未接受)非常适合我的需要:

print(os.getcwd())

/home/ubuntu/笔记本

原文由 Fabian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

如果您想获取脚本运行目录的路径,我强烈建议您使用,

 os.path.abspath('')

优点

  • 它适用于 Jupyter Notebook
  • 它适用于 REPL
  • 它不需要 Python 3.4 的 pathlib

请注意, __file__ 有优势的一种情况是,当您从目录 A 调用 python 但在目录 B 中运行脚本时。在这种情况下,上面以及大多数其他方法将返回 A,而不是 B。但是对于Jupyter notbook,你总是得到文件夹 .ipyn 文件而不是你启动的目录 jupyter notebook

原文由 Shital Shah 发布,翻译遵循 CC BY-SA 4.0 许可协议

__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')

原文由 shytikov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进