【问题标题】:VS Code pylint(import-error) "Unable to import" subsub-module from custom directoryVS Code pylint(import-error)“无法导入”自定义目录中的子模块
【发布时间】:2023-04-03 07:40:01
【问题描述】:

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

"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 - 行也没有效果。

【问题讨论】:

    标签: python visual-studio-code importerror pylint pylintrc


    【解决方案1】:

    另一个答案(受@andreas-l 启发):

    在我受影响的项目的 .pylintrc 中(问题是如何以及何时开始的,我不知道0),我找到了以下“消息控制”部分并在其中添加了“导入错误”:

    [MESSAGES CONTROL]
    
      disable=
        missing-docstring
        import-error
    

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

    【讨论】:

      【解决方案2】:

      我找到了解决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 不再显示这种无意义的东西了,这就是我想要的 :)

      我确信可能会有更优雅的解决方案,但到目前为止,上述解决方法派上了用场。如果有人提出“更好”的解决方案,请在此处发布,我会将答案更改为您的。


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

      我发现here 的类似解决方法(与上述pylint 相关)工作正常(将# type: ignore 附加到导入语句),我在this question 中也提到过:

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

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

      【讨论】:

        【解决方案3】:

        两件事。一、将__init__.py文件添加到你所有的子目录中,使它们成为正确的包。

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

        【讨论】:

        • 我已经在所有子目录和子子目录中放置了一个空的__init__.py 文件,甚至在主目录“Scripts”中也是如此。所以这不可能。至于您的第二点,您指的是从"python.autoComplete.extraPaths" 中删除anaconda3/../site-packages - 路径,因为这些站点包已经包含在我的"python.envFile" 中?
        • 我建议删除 site-packages,因为它本质上是任何 Python 解释器的 sys.path 的一部分,Pylint 应该知道(基本上我不知道其他人需要这样做让 Pylint 工作)。
        • 好的,谢谢你的信息。我已经从python.autoComplete.extraPaths 中删除了site-packages,代码确实仍然有效。另一方面,主要问题尚未解决,因为“无法导入......” - 通过将名为 __init__.py 的空文件放入每个主文件夹和子文件夹(我已经完成),消息并没有消失在问这个问题之前)。如果您知道我还能做些什么来防止 pylint 显示这些无用的导入错误,请提前致谢。
        • 您可以关闭 Pylint 中的特定检查器。您可以通过多种方式执行此操作(例如,.pylintrc 文件,每行,作为您传递给 Pylint 的内容)。 docs on Pylint in the extensoin 告诉您如何传递 CLI 参数。通过了,您需要阅读 Pylint 文档以了解如何禁用检查。
        • 我找到了一个非常简单的解决方法,可以抑制这些无用的导入错误,请参阅我的答案。我开始阅读 Pylint 文档,过了一会儿,我想知道是否没有更简单、更直接的方法可以简单地让 Pylint 关于自定义模块导入“闭嘴”,实际上我发现了一些东西。可能存在更复杂的方法,但目前我会花费太多时间来弄清楚。
        猜你喜欢
        • 2021-03-24
        • 2019-11-03
        • 2020-10-13
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        相关资源
        最近更新 更多