【问题标题】:How to set the default working directory of all Jupyter Notebooks as the project's parent folder如何将所有 Jupyter Notebooks 的默认工作目录设置为项目的父文件夹
【发布时间】:2021-09-30 15:12:00
【问题描述】:

问题:如何将在 Jupyter Lab 中双击打开的所有笔记本的工作目录设置为项目的文件夹 /myproject/,而不管该笔记本在该父级中的子文件夹如何文件夹?工作目录在 Linux/Mac 上由 !pwd 标识,在 Windows 上由 !cd 标识。

上下文: Jupyter Lab 会话由项目文件夹发起,由:/myproject/jupyter lab 发起。

我不是在寻找使用代码更改笔记本中的工作目录(例如使用!cd.. 或使用os),而是更改 Jupyter Lab 的设置,这样所有内核都将从所在的文件夹开始Jupyter Lab 已启动。

这对于能够使用一致的相对文件夹很有用,无论它们是从哪个子文件夹引用的。例如,用于加载特定子文件夹中的数据。

【问题讨论】:

    标签: jupyter-notebook ipython jupyter jupyter-lab


    【解决方案1】:

    我同意这通常是首选方法!我总是将我的笔记本配置为这样工作,因为它:

    • 可以轻松指定数据路径和输出路径,并且
    • 允许在目录之间移动笔记本而无需更改路径
    • 让 jupyterlab-lsp 代码智能工作更可靠

    我有一个名为make_paths_absolute.py 的python 模块,其内容如下:

    from os import chdir
    from pathlib import Path
    
    
    def make_paths_relative_to_root():
        """Always use the same, absolute (relative to root) paths
    
        which makes moving the notebooks around easier.
        """
        top_level = Path(__file__).parent
    
        chdir(top_level)
    
    
    make_paths_relative_to_root()
    

    在每个笔记本的第一个单元格中,我添加了一行 import make_paths_absolute。我喜欢这种方式,因为它可以做到:

    • 可重现:复制/克隆我的项目的任何人都可以运行代码,而无需在其 Jupyter 环境中自定义任何内容
    • 适用于所有笔记本界面(无论是 JupyterLab/RetroLab/classic Notebook)
    • 对于任何阅读笔记本的人来说,他们应该期望路径是绝对的(=相对于根),这一点非常明显。

    要完成这项工作,您首先需要在启动 JupyterLab 时将 PYTHONPATH 设置为指向存储库的根目录。要在 Linux/Mac 上执行此操作,您可以在 jupyter lab 命令前添加:

    PYTHONPATH=/path/to/your/lab/root:$PYTHONPATH jupyter lab
    

    PS。以上是我的设置的简化。实际上,我将make_paths_absolute.py 与其他初始化时间代码一起存储在helpers 包中(所以还有一个空的helpers/__init__.py,还有额外的.parent),包括一个名为notebook_setup.ipynb 的笔记本,其中包含诸如%matplotlib inline、pandas 自定义(比如确保它使用稳定排序)、警告过滤器等。所以我的每个笔记本都以:

    import helpers.make_paths_absolute
    %run helpers/notebook_setup.ipynb
    

    我真的很喜欢这种设置,两年来没有任何问题。

    【讨论】:

    • 非常感谢@krassowski!非常感谢,这是一个很好的解决方案。就我而言,我使用 jupytext 扩展名来为每个笔记本同步 ipynb 和 py 文件。通过这种方式,我可以使用 Jupyter Lab 进行开发,并在准备就绪时 - 从项目的根目录使用 CLI 使用 python3 运行。在这个用例中,make_paths_absolute()必须被注释掉。我想知道是否有一个 Jupyter Lab 设置可以自动设置根路径,而无需向笔记本本身添加代码。感谢您分享您的设置,太棒了:)!
    • 我认为没有 JupyterLab 设置。我可以想象 ipykernel 内核可以通过配置选项在内核级别上允许这样做,但 JupyterLab 本身没有权限决定特定内核/语言如何解释路径。您可以添加一个条件以仅在笔记本中使用来自stackoverflow.com/questions/15411967/… 的内容来使用它,而不是评论。我还更新了答案以在简化示例中删除额外的.parent
    • 谢谢@krassowski。是的,我也不熟悉基于 Jupyter 的选项,尽管我认为 Jupyter Lab 可能能够在双击笔记本后从根文件夹而不是子文件夹启动/初始化 ipython 内核文件。没有把握。如果确实没有 Jupyter 解决方案,那么以您在此处建议的精确方式使用代码的选项是我所知道的最佳选择。非常感谢:)
    • 我添加了一个关于更改我之前忘记的 python 路径的关键点。
    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2016-02-02
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多