__file__在Jupyter Notebook中不存在

时间:2016-08-24 14:04:03

标签: python-3.x path jupyter

我在使用Python 3.4.2和。的Jupyter Notebook服务器(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 param是相对路径还是绝对路径,并返回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的参考 How do I get the current IPython Notebook name (评论),最后的答案(不接受)非常适合我的需求:

print(os.getcwd())

  

/家庭/ ubuntu的/笔记本

4 个答案:

答案 0 :(得分:21)

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

os.path.abspath('')

优势

  • 它在Jupyter Notebook中工作
  • 它来自REPL
  • 它不需要Python 3.4的pathlib

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

答案 1 :(得分:14)

无法获得笔记本的路径。您可能会找到一种方法来获取它只能在一个环境中工作(例如os.getcwd()),但如果笔记本以不同的方式加载它将不一定有效。

相反,尝试编写笔记本,以便它不需要知道自己的路径。如果做了类似于获取pwd的事情,那么一定要快速失败/打印错误,如果这不起作用,而不是只是默默地尝试继续。

另请参阅:https://github.com/ipython/ipython/issues/10123

答案 2 :(得分:10)

在现代Python(v3.4 +)中,我们可以使用pathlib来获取笔记本的目录:

from pathlib import Path

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



更新

@ShitalShah我无法重现您报告的错误。无论启动了应用程序的当前工作目录如何,Jupyter Notebook看起来都可以正常工作。

示例:文件~/dir1/dir2/untitled.ipynb和Jupyter Notebook从~/dir1开始:

Jupyter notebook started in ~/dir1

Jupyter笔记本始于~/dir1/dir2

Jupyter notebook started in ~/dir1/dir2

答案 3 :(得分:3)

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