python模块的vscode导入错误

时间:2017-10-02 05:50:31

标签: python-2.7 visual-studio-code vscode-settings vscode-tasks

我正在尝试从一个目录级别进行python导入。

import sys

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

当我尝试运行构建任务时,我从VSCode收到错误:

  

ImportError:没有名为cn_modules的模块

相同的代码在终端(python)没有任何错误的情况下工作 当我尝试从VSCode运行构建任务运行时,我遇到了问题。
有关这里有什么问题的任何线索吗?

花了一些时间安静但无法解决这个问题,感谢任何帮助。

注意:当我使用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}"
            }
        ]
    }

tasks.json

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

9 个答案:

答案 0 :(得分:6)

我尝试将其添加到我的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"

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

答案 1 :(得分:2)

此解决方案可帮助我永久解决此问题。步骤如下。

  1. 按“ Ctrl + Shift + P”
  2. 类型:“配置特定于语言的设置”
  3. 然后选择“ Python”
  4. “ settings.json”将打开。检入此json文件中是否存在以下行:{“ python.jediEnabled”:false}(按“ Ctrl + F”,然后粘贴上面的链接以快速找到它)
  5. 如果是,则删除或注释掉这一行,保存文件并重新加载VScode。
  6. 完成!

答案 2 :(得分:1)

感谢Honza Kalfus jankalfus

我注意到,如果我使用文件->关闭文件夹,然后使用文件->打开文件夹...,然后再次打开项目文件夹,则错误消失了。如果我只是重新启动VS Code,我会不断收到错误消息。我认为某些内部缓存会被清除?

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

答案 3 :(得分:1)

除了在开头添加标题之外,我什么也没做

#!/usr/bin/env python

解决了我的问题...也许会对像我这样的新人有所帮助

答案 4 :(得分:1)

我遇到了同样的问题,就我而言,这是由于vscode调试过程的当前目录与脚本所在的目录不同。

print('cwd is %s' %(os.getcwd()))

就在您的sys.path.append和进口之前。我发生的事情是,正在运行的环境cwd似乎默认为工作区目录,该目录似乎是包含vs代码项目文件的目录,如果脚本所在的目录不在此目录中,则相对的include路径会损坏。

对此的一种解决方案是确保脚本将其当前目录更改为脚本所在的目录,并将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"

答案 5 :(得分:0)

就我而言,与

无关
"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,则没有问题。
但是,如果要调试test.py,则会收到“ ModuleNotFoundError”的异常
要修复它,我将其添加到调试配置launch.json

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

答案 6 :(得分:0)

因为这是VScode问题,所以我可以添加答案。

我们正在后端文件夹中运行许多Python Django后端,如下所示:

+projectBackends
    -oneService
    -twoService
    -threeService

因此,在VScode中的项目文件夹中,我只是打开了projectBackends文件夹,因为这将立即为我提供位于其下方的所有服务。看起来清晰而简单。 但是,所有插入操作都是从根目录projectBackends完成的,而不是从每个服务的根目录完成的:

from oneService.module1 import view

给出和导入错误,如果我放到哪里

from projectBackends.oneService.module1 import view

我没有错误,但是微服务无法正常工作。

所以最后,我为工作区中的每个微服务添加了一个文件夹,例如:

+oneService
+twoService
+threeService

解决了独立微服务的所有导入错误

答案 7 :(得分:0)

有两种方法。直接将其放入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

答案 8 :(得分:-1)

在launch.json文件中, 可以尝试设置env:{},作为" env":

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