2

我正在使用以下组件运行 Vscode:

Version: 1.51.1 (user setup)
Commit: e5a624b788d92b8d34d1392e4c4d9789406efe8f
Date: 2020-11-10T23:34:32.027Z
Electron: 9.3.3
Chrome: 83.0.4103.122
Node.js: 12.14.1
V8: 8.3.110.13-electron.0
OS: Windows_NT x64 10.0.20270
Pylance 2.6

我有以下目录结构:

src
    m1.py
    .vscode
        settings.json
    lib
        m2.py
        .vscode
        settings.json

在开发 Python 代码时,我在这个环境中使用了几个 linter。Mypy没有问题但pylance无法解决导入问题。

我正在尝试m2.py从失败m1.py时导入模块。pylance我的目录settings.json下的src文件是:

{
    "python.autoComplete.extraPaths": [
        "*.lib"
    ]
}

谁能看到如何解决这个问题?

4

4 回答 4

6

Pylance 使用python.analysis.extraPathspython.autoComplete.extraPaths.

{
    "python.analysis.extraPaths": [
        "*.lib"
    ]
}

你试过吗?

于 2020-12-11T04:56:39.390 回答
3

如果您的 VSCode 工作区文件夹是该文件夹的父src文件夹,那么抱怨是正常的,Pylance因为默认情况下,您的项目的根目录是您的工作区文件夹。您可以看到,如果我 importsrc.lib.m2 Pylance不会抱怨,但如果我使用它会抱怨lib.m2

在此处输入图像描述

由于您在运行代码时没有运行时错误,我会说您在src运行m1.py.

如果我的假设不正确,您需要添加更多详细信息(代码示例,如何运行m1.py文件)

于 2020-12-11T14:37:56.413 回答
0

将子文件夹设置为正确的 Python 包

此方法符合标准 Python 项目打包指南

我推荐一种设置,使子文件夹成为所有正确的 python 包。为此,请__init__.py在每个包含 Python 模块(即文件)的子文件夹中添加一个空白文件。

使用您的原始设置,忽略.vscode文件夹:

src/
  __init__.py
  m1.py
  lib/
    __init__.py
    m2.py

在这种情况下,导入需要来自src文件夹(它本身将被视为一个包,因为其中有一个__init__.py文件):

import src.m1
import src.lib.m2

制作合适的scripts包裹

但是,我建议将您的脚本放入它们自己的包中,而不是直接放入src文件夹中:

src/
  scripts/
    __init__.py
    m1.py
  lib/
    __init__.py
    m2.py

这允许使用正确的包名称而不是srclikeimport scripts.m1import lib.m2.

旁注

  • 如果您希望这些包成为“子包”,您可以__init__.py在 src 文件夹中保留一个,使其成为所有内容的根文件夹。
  • 随着这种变化,进口将是import src.scripts.m1import src.lib.m2
  • Python 将在父文件夹中查找,直到它找到一个没有文件的__init__.py文件夹,然后从作为包的任何子文件夹(即有一个__init__.py文件)开始链式导入语句。
  • 在此过程之后作为包链接在一起的任何文件夹都可以在本地访问,而无需添加到系统或 Python 路径。

如何从包中导入模块

在这种方案下,m1.py脚本应该能够导入m2.py类似下面的内容。由于src不是包,因此从 Python 的角度来看,它是根,并且不包含在导入语句中。

# In scripts.m1
import lib.m2 as m2

m2.function_1()
a = m2.function_2(m2.symbol_1)

或者

from lib.m2 import function_1, function_2, symbol_1

function_1()
a = function_2(symbol_1)

如果您在此设置中添加测试文件(例如在 中的tests目录中scripts),则可以将脚本函数导入为import scripts.m1 as m1from script.m1 import *.

此设置使包符合 python 包的标准,因此如果您想使其可安装或将其上传到 PyPi(或以其他方式使用 zip 文件或通过 git 存储库私下分发),您可以使用定义和构建项目setuptools 包使用标准setup.py文件。请参阅打包 Python 项目

于 2021-11-15T01:13:10.367 回答
-1

您的文件结构似乎是问题所在,为什么 PyLance 无法解析导入。最好的出路:创建一个python虚拟环境并激活它。

Linux

python -m venv env
source env/bin/activate

Windows PowerShell

py -3.6 -m venv env
.\env\Scripts\Activate

最后一步

激活您的虚拟环境后,

  • 只需按 ctrl+shift+p
  • 搜索“python”并点击“重启语言服务器”

多亏了虚拟环境,这应该可以解决所有导入问题。

于 2021-05-10T03:53:35.310 回答