VScode import导入自己的模块文件路径错误ModuleNotFoundError: No module named ‘v0‘

1. 问题描述(ubuntu20.04、windows、MacOS均可解决)

VScode的python报错 ModuleNotFoundError: No module named ‘v0’

我的工作区文件夹打开的是server,文件相对路径是:
server/v0/train_ddpg.py,其中的部分导入import代码如下,v0是上一级文件夹

from v0.cli import cli_train
from v0.config import config_dict

不想修改代码,因为需要改的地方太多了,而只通过设置vscode来解决。查了很多资料都没解决。

2. 先上答案

只需在Visual Studio Code的setting.json中添加如下代码

    "terminal.integrated.env.linux": {
        "PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"
    },
    //在工作区寻找模块(ubuntu、linux系统),MacOS上替换为"terminal.integrated.env.osx",Windows上替换为"terminal.integrated.env.windows"

解释说明(抄自chatGPT):

在 Visual Studio Code 的设置中,"terminal.integrated.env.linux" 允许你为在 Linux 系统下的集成终端设置环境变量。这些环境变量会在你打开一个新的终端实例时被应用。

让我们分析这个特定的设置:

  • "terminal.integrated.env.linux": 指定这些环境变量设置适用于 Linux 系统。

  • "PYTHONPATH": 是一个环境变量,用于 Python 解释器,指定模块查找的额外目录。

  • "${workspaceFolder}": 是一个预定义的变量,它会被替换为当前 VSCode 工作区的路径。

  • "${pathSeparator}": 是一个预定义的变量,它会被替换为操作系统的路径分隔符。在 Linux 系统中,这个分隔符是 :

  • "${env:PYTHONPATH}": 是一个预定义的变量,它会被替换为当前环境中 PYTHONPATH 环境变量的值。如果 PYTHONPATH 未设置,这将是一个空字符串。

整体解释:

这个设置将 PYTHONPATH 环境变量设置为包含当前工作区的路径和原始 PYTHONPATH 的值。这样做的目的通常是为了确保 Python 解释器能够在模块查找路径中找到工作区中的模块和包。

例如,如果你的工作区路径是 /path/to/workspace,并且原始 PYTHONPATH/path/to/some/libs,那么在这个设置下,新的 PYTHONPATH 将被设置为 /path/to/workspace:/path/to/some/libs。这意味着 Python 解释器将首先在 /path/to/workspace 目录中查找模块,然后在 /path/to/some/libs 目录中查找。

3. 其他方法:

1) 在工作区文件 .vscode/launch.json 中configurations 列表中添加"env"

            "env": {
                "PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"
            }

缺点:运行-启动调试(F5)和以非调试模式运行(ctrl+F5)中可用。但右上角三角形的“运行python文件”和“调试python文件”不可用,因为这俩操作不会考虑 launch.json 中的配置。需将代码的文件夹前缀删掉,即修改为如下才可用,不符合要求:

from cli import cli_train
from config import config_dict

2) “cwd”: “${fileDirname}”

在工作区文件 .vscode/launch.json 中configurations 列表中加入这一行,但我不好用:

"cwd": "${fileDirname}", //这个变量默认设置的是 workspaceFolder,搜的别人说是将它手动改成 fileDirname就可以正常导入模块,记得在上一行末尾加上一个逗号

失败说明(抄自chatGPT):

在 Visual Studio Code 的配置文件中,"cwd": "${fileDirname}" 是一个设置项,用于指定某些操作(例如,运行或调试代码)的当前工作目录(Current Working Directory, cwd)。这里的 ${fileDirname} 是一个预定义的变量,它会被替换为当前打开文件的目录名。

  • "cwd": Current Working Directory 的缩写,指的是进程的当前工作目录。在计算机程序中,这通常是文件系统中的一个目录或文件夹,用作执行文件和操作的默认路径或上下文。

  • "${fileDirname}": 是一个变量,它在运行或调试时会被替换为当前打开文件的目录路径。例如,如果你正在编辑一个位于 /path/to/your/file.py 的文件,${fileDirname} 将被替换为 /path/to/your/

"cwd": "${fileDirname}" 被用在 Visual Studio Code 的配置(例如,在 launch.json 中的调试配置)中时,它告诉 VSCode 在运行或调试代码时使用当前打开文件的目录作为当前工作目录。这对于确保相对路径和模块导入的正确解析非常有用。

例如,如果您在 launch.json 中有以下配置:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}"
        }
    ]
}

这意味着当您调试一个 Python 文件时,VSCode 将使用该文件所在的目录作为当前工作目录,并运行该文件。

3)“code-runner.fileDirectoryAsCwd”

在setting.json中设置 “code-runner.fileDirectoryAsCwd” ,适用于 Code Runner 扩展。但不管是true还是false均无效,与下一条类似

    "code-runner.fileDirectoryAsCwd": false, //true:代码在打开的文件夹下运行;false:始终在打开的工作区根目录下运行。

失败说明(抄自chatGPT):

在 Visual Studio Code 的 Code Runner 扩展中,"code-runner.fileDirectoryAsCwd" 是一个设置项,它决定了代码运行时的工作目录(Current Working Directory, CWD)。

"code-runner.fileDirectoryAsCwd": true
  • 当设置为 true,Code Runner 扩展将使用当前打开文件的目录作为运行代码时的工作目录。

    例如,如果你在 VSCode 中打开并运行了位于 /path/to/your/code.pycode.py 文件,那么代码将在 /path/to/your/ 目录中运行。这意味着所有的文件路径和模块导入都将基于这个目录。

需求和场景:

  • 模块导入:如果你的代码文件需要导入同一目录下的其他模块或文件,将此参数设置为 true 可以确保导入路径正确。

  • 相对文件路径:如果你的代码使用相对路径来读取或写入文件,将此参数设置为 true 可以确保文件操作基于代码文件所在的目录。

  • 多目录项目:在一个包含多个子目录的项目中,如果你希望在每个子目录中分别运行代码文件,将此参数设置为 true 可以确保每个代码文件在其所在目录中运行。

"code-runner.fileDirectoryAsCwd": false
  • 当设置为 false,Code Runner 扩展将使用 VSCode 工作区的根目录作为运行代码时的工作目录。

    例如,如果你的 VSCode 工作区的根目录是 /path/to/workspace/,不论你运行哪个文件,代码总是在 /path/to/workspace/ 目录中运行。这意味着所有的文件路径和模块导入都将基于这个目录。

需求和场景:

  • 单一工作目录:如果你的项目结构简单,所有的代码文件都在一个目录中,或者你希望所有的代码文件都在工作区的根目录中运行,将此参数设置为 false 可以简化文件和模块的路径管理。

  • 全局模块导入:如果你希望从工作区的根目录导入模块,而不是代码文件所在的目录,将此参数设置为 false 可以确保模块导入的一致性。

  • 全局文件操作:如果你希望所有的文件读写操作都基于工作区的根目录,将此参数设置为 false 可以简化文件路径的管理。

总结
这个设置项通常在 settings.json 文件中进行配置,你可以通过在 VSCode 中点击左下角的齿轮图标并选择“设置”来找到它,然后搜索 “Code-runner: File Directory As Cwd” 并选择你想要的值。或者,你可以直接在 settings.json 文件中添加或修改这个设置项。

这个设置项对于解决模块导入问题和文件路径问题非常重要,因为 Python 和其他一些语言通常在当前工作目录中查找模块和文件。

选择哪个设置通常取决于你的项目结构和代码的需求。如果你的代码高度依赖于文件和目录的组织结构,使用 "code-runner.fileDirectoryAsCwd": true 可能更合适。如果你的代码主要在一个统一的工作目录中运行,并且文件和模块的路径都是基于这个工作目录的,使用 "code-runner.fileDirectoryAsCwd": false 可能更合适。

4)“python.terminal.executeInFileDir”

在setting.json中设置 “python.terminal.executeInFileDir” ,适用于 Python 扩展。但不管是true还是false均无效,功能与上一条类似

    "python.terminal.executeInFileDir": false, //false使用工作区的根目录作为工作目录。true使用当前文件的目录作为工作目录。

失败说明(抄自chatGPT):

在 Visual Studio Code 的 Python 扩展中,"python.terminal.executeInFileDir" 是一个设置项,用于确定当你在终端中运行 Python 文件时的工作目录(Current Working Directory, CWD)。这个设置项的值会影响模块导入、文件路径解析等操作。

"python.terminal.executeInFileDir": true

功能:

当设置为 true,VSCode 将使用当前打开的 Python 文件所在的目录作为运行该文件时的工作目录。

使用场景:

  • 模块导入:如果你的 Python 文件需要导入同一目录下的其他模块或文件,将此参数设置为 true 可以确保导入路径正确。

  • 相对文件路径:如果你的 Python 代码使用相对路径来读取或写入文件,将此参数设置为 true 可以确保文件操作基于代码文件所在的目录。

  • 多目录项目:在一个包含多个子目录的项目中,如果你希望在每个子目录中分别运行 Python 文件,将此参数设置为 true 可以确保每个代码文件在其所在目录中运行。

"python.terminal.executeInFileDir": false

功能:

当设置为 false,VSCode 将使用工作区的根目录作为运行 Python 文件时的工作目录,而不是文件所在的目录。

使用场景:

  • 单一工作目录:如果你的项目结构简单,所有的 Python 文件都在一个目录中,或者你希望所有的 Python 文件都在工作区的根目录中运行,将此参数设置为 false 可以简化文件和模块的路径管理。

  • 全局模块导入:如果你希望从工作区的根目录导入模块,而不是 Python 文件所在的目录,将此参数设置为 false 可以确保模块导入的一致性。

  • 全局文件操作:如果你希望所有的文件读写操作都基于工作区的根目录,将此参数设置为 false 可以简化文件路径的管理。

总结

选择哪个设置通常取决于你的项目结构和代码的需求。如果你的代码高度依赖于文件和目录的组织结构,使用 "python.terminal.executeInFileDir": true 可能更合适。如果你的代码主要在一个统一的工作目录中运行,并且文件和模块的路径都是基于这个工作目录的,使用 "python.terminal.executeInFileDir": false 可能更合适。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值