【问题标题】:Debugger Differences: VSCode / Terminal (Python)调试器差异:VSCode / Terminal (Python)
【发布时间】:2019-07-08 12:02:06
【问题描述】:

我只是想使用以下代码读取 JSON 文件:

import json

with open("file.json") as File:
    print(json.load(File.read()))

当我尝试使用 VSCode 调试器运行它时,我得到了错误:

[Errno 2] No such file or directory: 'file.json'

但是当我使用 python file.py 从终端运行它时,它可以工作。 问题是,VSCode 不知何故使用了另一个“工作目录”,因为当我在 VSCode 中运行 os.getcwd() 时,我得到了 python 脚本所在文件夹的父文件夹的路径。 当我从终端运行它时,我得到了正确的路径。 这是为什么呢?

只是指出:问题不在于打印语句/json。当我只尝试打开文件而没有其他任何东西然后通过时,也会出现同样的错误。

【问题讨论】:

  • 无论您检查 file.json 的目录不是运行 Python 的目录。
  • 尝试打印this 以查看您当前的工作目录是什么。
  • 只需使用要导入的文件的绝对路径即可。编写脚本时,相对路径总是很危险的。
  • 我无法重现该问题,并且不:您的工作目录中肯定没有任何file.json
  • 另请注意,您可以使用json.load(File) 直接加载文件,而不是json.loads()

标签: python python-3.x


【解决方案1】:
import os 
dir_path = os.getcwd()

使用它来获取您的当前目录。您将能够辨别 Python 从何处运行。您还可以使用 JSON 文件的完整文件路径。

import json

with open("fullpath/to/json/file/file.json") as File:
    print(json.loads(File.read()))

【讨论】:

  • 不知何故,os.getcwd 不返回当前路径,而是返回文件所在文件夹的父文件夹。我不知道这是为什么?
  • 您从调用脚本的位置获取路径。如果你想要脚本的路径,你可以使用这个:from pathlib import PathPath(__file__).resolve().parent
  • 'os.getcwd 不返回当前路径','当前路径'是什么意思? @byJames
  • @BlueRineS os.getcwd() 不返回 python 文件所在文件夹的路径,而是返回该文件夹的父文件夹。
  • @byJames 为了使问题更清楚,我要求您通过添加项目结构来编辑您的问题。示例:/ProjectFolder/--main.py; --file.json、--childFolder/--childFile.txt等
【解决方案2】:

正如 cmets 中所讨论的,您的问题原来是您工作的环境。当程序从终端执行时,它工作并找到了文件。这很可能是因为您在 VS Code 中设置虚拟环境的方式。虚拟环境或称为venv,是独立于全局 Python 安装的 Python 解释器的隔离环境。当您处理需要不同版本库的两个不同项目时,它很有用。例如;一个使用 Django 1.10 的项目和一个使用 1.9 的项目,因此您不必在安装和卸载它们之间反复进行。

虚拟环境是包含 Python 的目录树 可执行文件和其他表明它是虚拟的文件 环境。

As explained here,您的 .json 文件很可能在您的项目虚拟环境之外,这就是它找不到它的原因。希望能帮助你理解。

【讨论】:

  • 是的,在同一个目录下,但问题不在于json语句。请再次阅读我的问题,我已更新。
  • 我不认为这可能是问题的根源,但是您是从 cmd/终端还是从 IDE 执行脚本?
  • 谢谢,我刚刚注意到问题所在:我使用 VSCode 执行它,它以某种方式抛出了这个错误,但是当我尝试从终端运行它时,它起作用了!但为什么呢?
  • 因为大多数 IDE 在虚拟环境中运行代码。您的项目在 venv 中设置的方式,它在虚拟环境而不是本地目录中查找文件。其他人可能会给出比我更好的解释,因为我很不擅长解释东西。 :)
  • 我不认为你不擅长解释某些事情,因为我只注意到这条评论的问题,现在我有点理解了,但它仍然让我感到困惑
【解决方案3】:

您可以使用 os 包验证文件是否存在:

import os.path
print(os.path.isfile("file.json"))

如果文件存在,这应该打印 True。

您也可以尝试使用绝对路径来确定。

【讨论】:

    【解决方案4】:
    import  json
    
    
    with open('/Users/my_pc/Downloads/example_2.json') as f:
         data = json.load(f)
    
    print(data)
    

    你可以通过这种方式加载你的 json 并给出你的目录的确切路径 您的 json 文件所在的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2018-12-02
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2021-12-06
      相关资源
      最近更新 更多