50

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

import sys

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

当我尝试执行 Run Build Task 时,我从 VSCode 收到错误消息:

ImportError:没有名为 cn_modules 的模块

相同的代码在终端 (python) 中没有任何错误
当我尝试从 VSCode Run Build task运行它时,我遇到了这个问题。
关于这里有什么问题的任何线索?

已经安静了一段时间,但无法解决此问题,不胜感激。


注意:这在我也使用 vscode 进行调试时有效。下面是我对 launch.json 和 tasks.json 的配置

启动.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}"
 }
4

9 回答 9

58

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

希望它可以帮助你!:)

于 2018-12-05T02:08:51.323 回答
14

下面给出的解决方案对我有用。

  1. Ctrl+Shift+P
  2. 类型:Configure Language Specific Setting
  3. 然后选择Python
  4. settings.json将打开。如果有这样的一行,请检查这个 JSON 文件:
{"python.jediEnabled": false}

(按Ctrl+F再粘贴上面那行可以快速找到)

  1. 如果是,则删除或注释此行,保存文件并重新加载 VScode。
  2. 完毕!
于 2019-09-28T13:58:55.743 回答
10

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

"env": {"PYTHONPATH": "${workspaceRoot}"}
于 2018-04-03T13:58:30.613 回答
7

就我而言,这与

"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",
于 2019-03-18T23:00:17.957 回答
6

谢谢 Honza Kalfus jankalfus

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

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

于 2019-04-03T20:34:47.650 回答
2

我遇到了同样的问题,在我的情况下,这是由于 vscode 调试过程的当前目录与脚本所在的目录不同造成的。做一个很有帮助的

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

就在您sys.path.append和您的进口之前。发生在我身上的是运行环境cwd似乎默认为工作区目录,该目录似乎是包含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"
于 2020-04-14T09:29:25.970 回答
2

我什么也没做,只是在开头添加标题

#!/usr/bin/env python

这解决了我的问题......也许它会帮助像我一样的新人

于 2020-04-12T01:05:53.097 回答
2

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

于 2020-08-16T04:53:40.523 回答
1

由于这是一个 VScode 问题,我可以添加我的答案。

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

+projectBackends
    -oneService
    -twoService
    -threeService

因此,在 VScode 的项目文件夹中,我刚刚打开了 projectBackends 文件夹,因为这将同时为我提供它下面的所有服务。看起来清晰而简单。但是所有的 linting 都是从 projectBackends 的根文件夹完成的,而不是从每个服务的根文件夹完成:

from oneService.module1 import view

给出并导入错误,如果我把

from projectBackends.oneService.module1 import view

我没有收到任何错误,但是微服务将无法正常工作。

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

+oneService
+twoService
+threeService

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

于 2020-08-06T07:51:35.083 回答