【问题标题】:Current working directory for jupyter notebook sets to temp folder in vscodejupyter notebook 的当前工作目录设置为 vscode 中的临时文件夹
【发布时间】:2020-03-30 23:34:35
【问题描述】:

我正在尝试将当前工作目录 (CWD) 设置为 VS Code 中 Jupyter Notebook 的已编辑文件位置。我在python.dataScience.notebookFileRoot 设置中使用${fileDirname}。但是它使用临时文件夹作为${fileDirname} 而不是原始文件夹。

同一个问题已经讨论过几次(例如https://stackoverflow.com/a/54794976/12488601),并指出了经过尝试的解决方案。

这是 cwd 的示例:

os.getcwd()
.. 'C:\\Users\\MjH\\AppData\\Local\\Temp\\1f6cc207-562f-4ae1-8754-e2013ae2c12d'

虽然预期结果是 C:\Workspace\Project。

所以在我的情况下使用${fileDirname} 不起作用。我使用以下临时解决方案,显然,如果文件被移动,它不会更新。

import sys
import os
sys.path.insert(0, r'C:\workspace\project')
os.chdir(sys.path[0])

现在我试图理解三件事:

  1. 我的案例是独一无二的吗?
  2. 如果是一般问题,是否已提交功能请求/问题以供 VS Code 解决?
  3. 有更好的临时解决方案吗?

VS Code 版本:Code 1.40.2 (f359dd6, 2019-11-25T14:54:45.096Z)
操作系统版本:Windows_NT x64 10.0.17763

【问题讨论】:

  • MjH。我没有看到其他人报告这个。当你启动一个笔记本时,你可以发布你的开发者控制台日志的内容吗?它在帮助-> 开发者工具下。我应该能够看到它试图在哪里设置工作目录。
  • Ian Huff,这是第 412 行临时文件夹首次出现的位置:workbench.desktop.main.js:sourcemap:254 [Extension Host] Info Python Extension: 2019-12-17 20:33:50 :在 C:\Users\MjH\AppData\Local\Temp\7decbe34-3c30-447a-94d9-3aeb9a0bbe48\jupyter_notebook_config.py 生成自定义默认配置。完整日志在这里:pastebin.com/6x2WxK8D
  • 谢谢,我现在正在查看日志。只是为了检查一下,它输入的内容是否与设置中没有引号的 ${fileDirname} 完全相同?我知道在某些时候有些人输入 ${fileDirName} 或 "${fileDirname}" 两者都会有问题。这是我目前想出的唯一想法。如果我们无法解析变量,我们默认回到我们打开的临时 ipynb 文件的位置,这就是您所看到的。
  • 它实际上是 ${fileDirName},大写为 N。我更改了它并重新启动了 VSC,但仍然以临时目录结束。为问题添加了设置快照。

标签: python visual-studio-code jupyter-notebook


【解决方案1】:

要回答你的第三个问题,试试这个:

import os

os.system("echo %cd% > dir")
file = open("dir", "r")
filePath = file.read()
file.close()

print(filePath.split("\n")[0])

【讨论】:

  • 感谢您的建议,但不会奏效。我的 CWD 是临时文件夹。所以上面会用'cd'获取临时文件夹地址(并将其写入'dir'文件)。
【解决方案2】:

我也受到这个问题的影响。 这是我解决它的方法。

Python > DataScience: Notebook File Root中使用${fileDirName}的配置参数,我可以在我的环境中检查这个效果。

如果我使用命令 Ctrl+Shift+P > Python:Show Python Interactive Window 打开 Python 交互窗口,然后运行:

import os
os.getcwd()

输出是一个随机的临时文件夹。所以我无法进行导入,导致找不到我的本地相关模块。

但是,如果我不是直接打开一个新的 Python 交互式窗口,而是运行我的任何 python 文件的代码单元格

#%%
print("Some string here")

然后找到当前的工作路径,如预期的那样变为fileDirName。然后与交互式窗口的任何交互都将正确执行(并且我的下一个导入将正确执行)。

为了避免这种行为并且因为我想在我的 workspaceFolder 中执行操作,我将 Jupyter: Notebook File Root 更改为 ${workspaceFolder}。在这种情况下,打开一个新的 Python 交互窗口,将自动将当前路径设置为工作区文件夹,无论是否需要执行任何 python 单元。

我认为,在使用${fileDirName}时,最好将当前工作打开的文件夹设置为Python交互窗口(Jupyter)的工作路径,而不是临时随机文件夹(在没有执行特定单元格的情况下打开),但看起来不像那样。

希望有用!

Edit :

自 2020 年 11 月起,Jupyter 扩展与 Python 分离 VS 代码的扩展。设置键已重命名为 python.data science 到 jupyter

【讨论】:

  • 首先谢谢你。我试了一下,它没有用。我知道 workspaceFolder 选项。我没有大项目,我有小实验的东西,所以我不想每次都改变workspaceFolder。
  • 这个解决方案对我有用。我已经通过许多其他选项来修改 PYTHONPATH 系统变量,以便我的路径是正确的……不走运。当我将虚拟环境引入我的项目时,所有 PYTHONPATH 选项都停止工作。告诉 VS Code 使用工作区文件夹分析起点是天才。赞一个!
【解决方案3】:

我遇到了同样的问题。我通过手动将设置放入settings.json 文件来解决它:

{
    "jupyter.notebookFileRoot": "${fileDirname}",
}

为什么它可以解决问题(我的猜测):

Jupyter 在启动时会更改工作目录。在此之后,实现了来自settings.json 文件的 notebookFileRoot 设置,但是由于${fileDirname} 是默认设置,因此不会将其添加到 json 文件中。因此,如果通过 vscode 中的 UI 设置进行设置,则文件根目录不会更改回 ${fileDirname}

【讨论】:

  • 抱歉,自从转向 C# 以来,已经有一段时间没有回到这个话题了。会试一试。感谢您花时间在这里发布!
【解决方案4】:

截至 2021 年 1 月,在我的设置中添加以下行有助于解决问题

"jupyter.notebookFileRoot": "${workspaceFolder}",

【讨论】:

  • 谢谢。如果有人可以验证它,我将不胜感激并将其标记为答案。我现在不能自己做。
  • 确实,这似乎是新的设置名称,对我有用。
  • 感谢@Ant 的确认,我们现在可以将此标记为已接受的答案...
  • 我也确认了这一点。 :)
  • 这个解决方案目前不起作用......谁知道为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多