VSCode Python调试器 FileNotFoundError

7

让我们定义一个简单的文件夹结构,如下所示:

project
+---code
|       main.py
|
\---data
        foo.txt

main.py:

foo_path = "./../data/foo.txt"

with open(foo_path) as f:
    s = f.read()
    print(s)

这段代码在正常运行时使用python main.py命令效果良好,但使用VSCode Python调试器进行调试时会抛出以下错误。
Exception has occurred: FileNotFoundError
[Errno 2] No such file or directory: './../data/foo.txt'
  File "C:\Users\user\Workspaces\project\code\main.py", line 3, in <module>
    with open(foo_path) as f:

我正在使用带有Python 3.7.1 Anaconda版本的VSCode在Windows 10上。我知道文件路径类似于Linux路径,但是在正常运行时它可以工作。我在Python VSCode扩展的GitHub存储库中没有找到任何未解决问题。这是一个常见错误,还是我做错了什么?
此外,如果我定义foo_path = ".\\..\\data\\foo.txt",它的行为与之前的相同。它在正常运行时运行良好,并在调试时给出相同的错误。
如何在不使用额外包(如os.path)或使用完整文件路径的情况下修复此问题?
编辑:我在Ubuntu 18.04中尝试了一下,结果表现相同。

我遇到了完全相同的问题。奇怪的是终端显示:FileNotFoundError [Errno 2] No such file or directory: 'path/to/file.py'。但是,我可以用Option+单击“path/to/file.py”在VS Code中打开该文件。你是否找到了可行的解决方案? - Ryan
5个回答

5
您可以在调试配置中使用 cwd 选项,但我建议您不要硬编码路径,而是使用 pathlibos.path 来指定相对于 __file__ 的位置的文件(我不太确定为什么您要避免使用这些模块)。

那不是要避免这些模块。我认为,正常运行和调试应该是相同的,我只是不想让答案包括os.pathpathlib。但是cwd选项是有意义的。它的默认值是${workspaceFolder}。如果foo_path="data/foo.txt",它可以工作。或者,我可以像你建议的那样更改cwd。谢谢。 - Alperen
1
对我没用,但是 "cwd": "${fileDirname}" 有用,这在链接中没有提到,但在这里:设置 cwd。记住,如果我再次遇到这个重复的问题 :) - Spartan
pathlib的p = Path('my.csv').resolve().__str__(); with open(p, 'r') as csv_file:并没有起到帮助作用。 - Yu Da Chi
@Oleg 你可能想要使用 (Path(__file__).parent / 'my.csv').open('r') as csv_file: ...。我建议不要在路径对象上调用 __str__()/str()。这通常是不必要的(感谢 https://peps.python.org/pep-0519/),如果有人意外传递了像 None 这样的文件路径,它可能会导致奇怪的错误。如果你真的需要路径的字符串,请使用 os.fsdecode() - Brett Cannon
@BrettCannonq 我在使用Path对象作为路径时总是遇到字符串问题 - 这太烦人了,只要使用标准库之外的任何应用程序。至于解决方案 - 谢谢,我会尝试的! - Yu Da Chi

4

没错。我也遇到了同样的问题,以下是我修复的方法

在 vscode 的内置终端中:

  • 将目录更改为代码所在位置。例如:
cd /path_to_your_code_dir/

在我的情况下,它是:

cd /repos/

因为我的代码在这里 -> ~/repos/main.py

  • 然后再次运行VSCode Python调试器

.
(已编辑)

我发现了这个错误的原因和更好的解决方法

这个错误出现是因为Python调试器默认情况下在当前打开文件夹中执行文件
但是您可以改变这种行为,以在文件目录中使用execute:

  • 前往VSCode设置(或使用快捷键:ctrl+逗号
  • 然后在设置中搜索 @ext:ms-python.python execute
  • 你会看到“在文件目录中执行”的设置
  • 然后勾选该框,以在文件目录中而不是当前打开文件夹中执行代码
  • 回到您的代码并重新运行(即点击调试器运行按钮)

当您知道文件位于正确位置且指向正确方向时,此操作可消除FileNotFoundError。


0

我使用pathlib,它始终可靠,无论是在运行时还是调试期间:

import os
import pathlib

foo_path = os.path.join(pathlib.Path(__file__).parent.absolute(), "..", "foo.txt")

with open(foo_path) as f:
    s = f.read()
    print(s)

0
对于我来说,我的main.py文件在A文件夹内的B文件夹中。如果我在A文件夹中打开VSCode,并尝试调试main.py文件,则会出现“FileNotFoundExeption”错误,提示找不到“file.txt”文件。但是,如果我在B文件夹中打开VSCode并进行相同的操作,则可以正常运行。
folder A
-- folder B
|     main.py
|     file.txt

(按照另一条评论提出的建议,将设置Python>终端:在文件目录中执行并不能解决我的问题)


0
代码存在于/src目录中 调试器的cwd指向根目录/

/src/foo.py

代码:

file = open('../files/temp.txt')

launch.json - 产生FileNotFound错误:

    "configurations": [
        
        {
            "name": "Python: File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}"
        },

    ]
}

修复了cwd
{
    "configurations": [
        
        {
            "name": "Python: File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}/src"
        },

    ]
}

cwd(在 launch.json 中)更改为指向我的 source_code 文件所在的目录,解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接