VS Code pylint(导入错误)“无法从自定义目录导入”子模块

And*_* L. 5 python pylint importerror visual-studio-code pylintrc

我已经将我自己编写的 Python 脚本组织在一个由多个子目录组成的树中,从已经包含在"python.autoComplete.extraPaths"settings-json 中的父目录“Scripts”开始:

"python.autoComplete.extraPaths": ["/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts",
                                       "/home/andylu/anaconda3/lib/python3.7/site-packages"]
Run Code Online (Sandbox Code Playgroud)

除此之外,我还包含了一个 Python 环境文件:

"python.envFile": "/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Visual_studio_code/vscode_own_scripts.env"
Run Code Online (Sandbox Code Playgroud)

其中包含该行

export PYTHONPATH=/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts:/home/andylu/anaconda3/lib/python3.7/site-packages
Run Code Online (Sandbox Code Playgroud)

所有这些以前都很好,我所有的脚本都分布在 1 个以上的单个目录级别,如下所示:

+---Scripts
|   +---General
|   |   +---script_one.py
|   |   +---script_two.py
Run Code Online (Sandbox Code Playgroud)

当我在任何 python 脚本中导入时,例如script_one.py,我用

import sys
sys.path.append(
    "/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts/"
)

import General.script_one as one
Run Code Online (Sandbox Code Playgroud)

并且 pylint 正确识别了这个导入的脚本,而不会抛出上述VS Code pylint(import-error).


现在,情况不同了。脚本变得如此之多,我将子文件夹拆分General包含一个额外的子目录级别,以便更清晰地组织脚本:

+---Scripts
|   +---General
|   |   +---Plotting
|   |   |   +---script_one.py
|   |   |   +---script_two.py
|   |   +---Misc
|   |   |   +---script_three.py
|   |   |   +---script_four.py
....
Run Code Online (Sandbox Code Playgroud)

例如,当使用以下几行启动 Python 脚本时,我会得到VS Code pylint(import-error)以下每个导入的 。

# Package importing

import sys
sys.path.append(
    "/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts/"
)

import General.Plotting.auxiliary_plotting_functions as aux_plot
import General.Plotting.plotting as plot

#%%
# TIME MEASUREMENT for the entire code/function
import General.Misc.timing
Run Code Online (Sandbox Code Playgroud)

我不知道为什么 pylint 突然停止识别导入,只是因为我添加了一个额外的子目录级别。我希望这些无意义的 pylint 导入错误消失,因为在执行代码时有效地导入了子子模型。

我什至试图修改.pylintrc- 文件,它位于 /home/andylu/anaconda3/pkgs/pylint-2.3.1-py37_0/lib/python3.7/site-packages/pylint/test/regrtest_data/.pylintrc

[MASTER]

optimize-ast=no

init-hook='import sys; sys.path.append("/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts")'
Run Code Online (Sandbox Code Playgroud)

添加init-hook- 行也没有效果。

Bre*_*non 5

两件事情。一,将__init__.py文件添加到所有子目录中,使它们成为合适的包。

二,你应该不需要直接添加site-packages目录。如果这是您正在使用的 Python 环境,那么您需要确保从扩展中选择它。


And*_* L. 5

我通过这个答案找到了一个很好的解决方法。它指向pylint-docs消息控制部分

实际上,我只需要# pylint: disable=import-error在我的自定义导入后面添加注释,如下所示:

import General.Plotting.auxiliary_plotting_functions as aux_plot  # pylint: disable=import-error
Run Code Online (Sandbox Code Playgroud)

这完美地解决了我的问题,因为老实说,我没有通过配置.pylintrc文件找到一个简单的解决方案,更不用说我所有的尝试都无济于事,涉及PYTHONPATH环境文件等。

简而言之,在 VS Code 中执行脚本时,我的自定义模块被正确导入,但唯一令人讨厌的细节是 pylint 没有得到它,并向我显示了无用的导入错误。现在,pylint 不再显示这种无意义的东西,这就是我想要的:)

我确信可能有更优雅的解决方案,但到目前为止,上述解决方法派上了用场。如果有人提出了“更好”的解决方案,只需将其张贴在这里,我会将答案更改为您的。


PS对于那些使用pylance作为替代linter的人VS-Code

pylint我在这里找到一个类似的解决方法(与上面提到的有关)工作正常(附加# type: ignore到导入语句),我在这个问题中也提到过:

import General.Misc.general_tools as tools  # type: ignore
Run Code Online (Sandbox Code Playgroud)

很可能它与 的settings.json- 文件有关VS-Code,因为 usingVS-Code是这里的常数因素。