Python模块在VS Code中导入出错

59

我正在尝试在Python中从上一级目录进行导入。

import sys

sys.path.append('..')
from cn_modules import exception

当我尝试运行构建任务时,从VSCode中获取了以下错误:

ImportError: No module named cn_modules

在终端(python)中没有任何错误,同样的代码可以正常工作。
当我尝试从VSCode Run Build task中运行它时,我面临着这个问题。
你知道出了什么问题吗?

我花了很多时间,但无法解决此问题,非常感谢您的帮助。


注意:使用VSCode进行调试时可以正常工作。下面是我的launch.json和tasks.json配置:

launch.json

 {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python Console App",
                "type": "python",
                "request": "launch",
                "stopOnEntry": true,
                "program": "${file}",
                "externalConsole": true,
                "debugOptions": [
                    "WaitOnAbnormalExit",
                    "WaitOnNormalExit"
                ],
                "env": {},
                "envFile": "${workspaceRoot}/.env",
                "console":"integratedTerminal",
                "pythonPath": "${config:python.pythonPath}"
            }
        ]
    }

任务清单.json

{
        "version": "0.1.0",
        "command": "/usr/bin/python",
        "isShellCommand": true,
        "args": ["${file}"],
        "showOutput": "always",
        "env": {},
        "envFile": "${workspaceRoot}/.env",
        "pythonPath": "${config:python.pythonPath}"
 }

2
“向上一级目录”...从哪里开始?您是否了解当前工作目录?如果您想从脚本所在的位置向上进入一个目录,那么您需要先找到脚本的路径。 - Aran-Fey
2
可能是如何在Python中正确确定当前脚本目录?的重复问题。 - Aran-Fey
3
在Python中,我没有任何问题运行代码,它能正常工作。但是,当我尝试从VSCode的生成任务中运行相同的代码时,我遇到了问题。 - Chandan Nayak
构建任务在哪里设置CWD(当前工作目录)? - ifconfig
1
这是VSCode已知的问题,设置'cwd'和类似的功能不起作用。 - gented
显示剩余5条评论
11个回答

71

我尝试在我的launch.json中添加这个,然后它就起作用了!

"env": {"PYTHONPATH": "${workspaceRoot}"}

以下是我的launch.json

        "name": "Python: Current File (Integrated Terminal)",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "cwd": "${workspaceRoot}",
        "env": {"PYTHONPATH": "${workspaceRoot}"},
        "console": "integratedTerminal"

希望这能对您有所帮助!:)


2
之后我还需要重新启动VS Code。 - karu
9
launch.json文件在哪里可以找到? - James Huang
@JamesHuang 按下 ctrl + shift + p,输入 launch.json 然后按回车键。 - Yuvraj Singh Jadon
2
@JamesHuang 配置是在工作区中的 .vscode 文件夹中存储的 launch.json 文件中定义的。如果不存在,可以通过侧边栏中的调试菜单进行初始化。 - bwdm
5
最新版的VS Code中已经找不到launch.json文件了。 - John Jiang
3
@JohnJiang 如果没有 .vscode 目录,你可以在项目目录中创建一个。然后你就可以在其中创建 launch.json 文件了。 - Raid

15

在您的 launch.json 文件中,将 env: {} 更改为:

"env": {"PYTHONPATH": "${workspaceRoot}"}

8
launch.json 文件存放在哪里? - Antonio Sesto
这对我也起作用了,谢谢。周末之后它突然开始失败了。我猜是VS更新的问题。 - Juan
直接将此内容放入settings.json中是否安全? - jbchurchill

15

以下是我使用并有效的解决方案。

  1. 按下Ctrl+Shift+P
  2. 输入:Configure Language Specific Setting
  3. 然后选择Python
  4. settings.json将打开。在此JSON文件中检查是否有这样一行:
{"python.jediEnabled": false}

(按 Ctrl+F 然后粘贴上面的行以快速查找)

  1. 如果是,则删除或注释此行,保存文件并重新加载VScode。
  2. 完成!

7
如果你的痛苦跟我的一样 - 那么python.jedi在做什么?请参考这个链接 - Timo

8

在我的情况下,这与

IT技术无关。
"env": {"PYTHONPATH": "${workspaceRoot}"}

这是我的文件夹/模块结构:
/Dev/csproj/deploy/test.py 
/Dev/csproj/util/utils.py

在test.py中,它导入了utils函数

import sys
sys.path.append('../')
from util.utils import get_keyvault_secret

如果我在终端文件夹/Dev/csproj/deploy/中运行test.py,没有任何问题。但是如果我想在VSCode中调试test.py(在workspaceRoot下),就会出现"ModuleNotFoundError"的异常。
为了解决这个问题,我将以下内容添加到我的调试配置launch.json中:

"cwd": "${workspaceRoot}\\Dev\\csproj\\deploy",

8

感谢 Honza Kalfus jankalfus

我发现如果我使用“文件” ->“关闭文件夹”,然后再使用“文件” ->“打开文件夹...”并重新打开项目文件夹,错误就消失了。 如果只是重新启动 VS Code,我会继续收到错误提示。 我认为某些内部缓存被清除了?

在这里找到 https://github.com/Microsoft/vscode/issues/10391


对我来说,这是正确的答案。 - Chris Zuidema

4
我遇到了同样的问题,我的情况是由于 vscode 调试进程的当前目录与脚本所在的目录不同导致的。 做一个 cd 命令来切换至正确的目录会很有帮助。
print('cwd is %s' %(os.getcwd()))

在您执行sys.path.append和导入代码之前。我的情况是,运行环境的当前工作目录似乎默认为工作区目录,这似乎是包含vs代码项目文件的目录,如果这不是脚本所在的位置,则相对包含路径将无法正常工作。

解决方法是确保您的脚本更改其当前目录为脚本所在的目录,并将syspath附加到脚本所在的目录:

scriptdir = os.path.dirname(os.path.realpath(__file__))
print('dir containing script is %s' % (scriptdir))

# append our extra module directory (in this case Autogen) onto the script directory

sys.path.append(os.path.join(scriptdir, 'Autogen'))

# also change cwd to where the script is located (helps for finding relative files)
print('============\ncwd is %s' %(os.getcwd()))

os.chdir(scriptdir)
print('============\ncwd after change to script dir is %s' %(os.getcwd()))

所有上述步骤都有助于使您的脚本运行良好,但它们对智能感知或代码完成没有帮助。要使代码完成正常运行,您必须创建一个 .env 文件(通常与您的 .vscode 目录位于同一目录中),并在您的 .env 文件中添加您想要 vscode 查找额外 Python 模块的目录。
.env 文件的内容
PYTHONPATH="someDirRelativeTowhereYourVSCodeProjectLives\\Autogen"

出于好奇,为什么要踩我?我尝试正确回答并指出可能导致问题的事情了吗? - Paulus

3
有两种方法。直接将其放置在 launch.json 中或使用一个 .env 文件。
全部放在 launch.json 中。 launch.json
"env": {"PYTHONPATH": "${workspaceRoot};${workspaceRoot}/modules;${workspaceRoot}/modules/somePrj/modules"}

使用 .env 文件

launch.json

"envFile": "${workspaceRoot}/.env"

.env

PYTHONPATH=".;modules;/modules/somePrj/modules"

建议使用.env文件方式,因为我们可以选择prod.envtest.env


2
对我而言,问题与VSCode中所选择的Python解释器与我电脑上所使用的整体版本的Python不匹配有关。
在VSCode中所选择的Python解释器为 Python 3.8.10 64-bit (Microsoft Store)(这是推荐版本)。

enter image description here

当前我电脑上的全球版 Python 版本为Python 3.10.4

enter image description here

将解释器更改为Python 3.10.4 64位后,所有导入错误都消失了。

2

我只是在开头添加了一个标题

#!/usr/bin/env python

这解决了我的问题...或许能帮助像我一样的新手


1

在微软解决这个问题之前,您可以在想要导入的文件和正在使用的Python环境所在的文件夹之间创建符号链接,这对我解决了问题。

将路径添加到Win10中没有起作用,更改xtraPath.json也没有起作用(如何具体填写括号中的内容仍是一个谜)。

我在这上面浪费了三天时间。希望VSCode的开发人员能看到这个问题。你们浪费了数千小时来解决这个问题,而实际上解决这个问题的时间比设置IDE花费的时间还要少得多。不要再浪费人们的时间了!


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