Python 3.x __Jupyter笔记本中不存在文件

Python 3.x __Jupyter笔记本中不存在文件,python-3.x,path,jupyter,Python 3.x,Path,Jupyter,我在一个使用Python 3.4.2和 我想使用全局名称\uuuuu文件\uuuuu,因为笔记本将从其他用户克隆,我必须在一个部分中运行: def __init__(self, trainingSamplesFolder='samples', maskFolder='masks'): self.trainingSamplesFolder = self.__getAbsPath(trainingSamplesFolder) self.maskFolder = self.__getA

我在一个使用Python 3.4.2和 我想使用全局名称
\uuuuu文件\uuuuu
,因为笔记本将从其他用户克隆,我必须在一个部分中运行:

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)
\uu getAbsPath(self,path)
检查
路径
参数是相对路径还是绝对路径,并返回
路径
的绝对版本。因此,我可以在以后安全地使用返回的
路径

但是我得到了错误

名称错误:未定义名称
“\u文件”

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

/usr/local/lib/python3.4/dist-packages/ipykernel/\uuuuu-main\uuuuuuuuuu.py

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

感谢Martijn Pieters(评论)的参考。最后一个答案(不接受)非常适合我的需要:

print(os.getcwd())

/主页/ubuntu/笔记本


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

相反,试着写笔记本,这样它就不需要知道自己的路径。如果做一些事情,比如获取pwd,那么请确保快速失败/如果这不起作用,请打印错误,而不是默默地尝试继续

另请参见:

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

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我无法重现您报告的错误。无论应用程序启动的当前工作目录是什么,Jupyter笔记本似乎都可以正常工作

示例:文件
~/dir1/dir2/untitled.ipynb
和Jupyter笔记本在
~/dir1
中启动:

Jupyter笔记本从
~/dir1/dir2
开始:


\uuuuu文件\uuuuu
可能不适用于您,但实际上,您可以以不同的方式获取笔记本所在的当前文件夹

全局变量中有跟踪,如果调用
globals()
,您将看到有一个元素的键为
\u 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')

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

os.path.abspath('')
优势

  • 它可以从Jupyter笔记本中使用
  • 它从REPL开始工作
  • 它不需要Python 3.4的pathlib

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

\uuuuuuuu文件
适用于模块和Python脚本,而不是笔记本电脑。你找到的答案在这里不适用。看起来更相关?@ShitalShah请查看更新的答案。也许您可以澄清一下,您遇到的问题是什么。
Path
有一个类方法用于此:
Path.cwd()
@mac,这不起作用。如果您更改笔记本中的cwd,然后重新执行该单元格,它将为您提供新的cwd,而不是notbook的位置。这是Jupyter笔记本中非常缺失的功能。我不得不求助于涉及Javascript的黑客攻击。你说我更新的帖子中的场景是不可能的吗?“如果您在笔记本中更改cwd”是什么意思?:)@mab:Try
importos;chdir('path/to/new/dir')
。如果您现在同时尝试
Path.cwd()
Path().resolve()
,它们都指向
Path/to/new/dir
,而不是笔记本的位置!这对我不起作用。当我用造纸机运行笔记本时,它会给我一个“工作目录”,真是令人惊讶。在我的测试中,所有3个场景都有效。这可能是因为造纸厂(我不熟悉)?@Shital,untidyhair是正确的。这与下面mab的其他建议一样,不起作用。它只提供cwd。您是对的,使用os.getcwd()无法获取笔记本的路径。这只是得到了cwd。如果您在笔记本中更改了,那么返回到该单元格,您将无法获得笔记本目录。这是一个巨大的问题。不,我不同意你应该写你的脚本,这样它就不需要知道它在哪里。这样做有很好的理由,比如复制到另一个地方。哇,恭喜@shytikov,你的方法真的很有效,应该是首选答案。您已经找到了一种避免丑陋的JS攻击的方法。非常非常感谢。现在,如果我们能找到一种获取笔记本名称的方法,它看起来可以在笔记本中使用,但不能在常规Python解释器中使用(至少在作为模块导入时)。我在使用Jupyter内核和常规Python解释器之间切换,因此我需要在两者上都能工作的东西。我想我要求助于一个环境变量。这在JupyterLab和Pycharm中对我都有效,而其他建议则不行。为什么不使用
os.getcwd()
来代替
globals()[''u dh'][0]
?当使用造纸机从不同的目录执行笔记本时,这对我不起作用。
os.getcwd()
globals()