VS Code pylint(导入错误)"Unable to import" 来自自定义目录的子子模块

VS Code pylint(import-error) "Unable to import" subsub-module from custom directory

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

"python.autoComplete.extraPaths": ["/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts",
                                       "/home/andylu/anaconda3/lib/python3.7/site-packages"]

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

"python.envFile": "/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Visual_studio_code/vscode_own_scripts.env"

其中包含行

export PYTHONPATH=/home/andylu/Dokumente/Allgemeines_material/Sonstiges/Programming/Python/Scripts:/home/andylu/anaconda3/lib/python3.7/site-packages

之前,我所有的脚本都只分布在1 个目录级别,就像这样:

+---Scripts
|   +---General
|   |   +---script_one.py
|   |   +---script_two.py

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

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

import General.script_one as one

并且 pylint 正确地识别了这个导入的脚本 而没有抛出 前面提到的 VS Code pylint(import-error).


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

+---Scripts
|   +---General
|   |   +---Plotting
|   |   |   +---script_one.py
|   |   |   +---script_two.py
|   |   +---Misc
|   |   |   +---script_three.py
|   |   |   +---script_four.py
....

当使用例如 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

我不知道为什么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")'

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

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

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

我找到了解决 this answer 问题的好方法。 它指向 message control part of the pylint-docs.

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

import General.Plotting.auxiliary_plotting_functions as aux_plot  # pylint: disable=import-error

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

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

我确信可能有更优雅的解决方案,但到目前为止,上述解决方法派上了用场。如果有人提出“更好”的解决方案,请 post 在这里,我会把答案改成你的。


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

我也发现了 here works fine (appending # type: ignore to the import-statement), which I mentioned in this question 类似的解决方法(针对上述 pylint):

import General.Misc.general_tools as tools  # type: ignore

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

另一个答案(灵感来自@andreas-l):

在我受影响的项目的 .pylintrc 中(问题是如何以及何时开始的,我不知道 0),我找到了以下 'Messages Control' 部分并向其中添加了“import-error”:

[MESSAGES CONTROL]

  disable=
    missing-docstring
    import-error

重新启动 VSCode 并且没有更多错误消息。