我在使用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的/笔记本
答案 0 :(得分:21)
如果要获取运行脚本的目录的路径,强烈建议使用
os.path.abspath('')
优势
请注意,__file__
具有优势的一种情况是,当您从目录A调用python但在目录B中运行脚本时。在这种情况下,上述方法以及大多数其他方法将返回A,而不是B。但是对于Jupyter notbook,您总是获得.ipyn
文件的文件夹,而不是启动jupyter notebook
的目录。
答案 1 :(得分:14)
无法获得笔记本的路径。您可能会找到一种方法来获取它只能在一个环境中工作(例如os.getcwd()
),但如果笔记本以不同的方式加载它将不一定有效。
相反,尝试编写笔记本,以便它不需要知道自己的路径。如果做了类似于获取pwd的事情,那么一定要快速失败/打印错误,如果这不起作用,而不是只是默默地尝试继续。
答案 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笔记本始于~/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')