【问题标题】:Pylint Reports False Import Errors for Project with Nested StructurePylint 报告具有嵌套结构的项目的错误导入错误
【发布时间】:2020-11-04 01:33:55
【问题描述】:

我的 Python Chalice 项目运行良好,我的所有测试都通过了,但 Pylint 报告了 unresolved import 错误。

我已经在具有以下项目结构的 vanilla Python 项目中重现了该错误:

myproject
    .vscode
        settings.json
    /api
        /domain
            __init__.py
            weekday.py
        __init.py
        app.py
    /tests
        /api
            /domain
                __init__.py
                test_weekday.py
            __init__.py
        __init__.py

.vscode/settings.json:

{
    "python.pythonPath": "C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python38\\python.exe"
}

weekday.py:

from enum import Enum


class Weekday(Enum):
    MONDAY = 'mon'
    TUESDAY = 'tue'
    WEDNESDAY = 'wed'
    THURSDAY = 'thu'
    FRIDAY = 'fri'


class InvalidValue(Exception):
    pass


def parse(key: str) -> Weekday:
    try:
        return Weekday(key)
    except Exception as e:
        raise InvalidValue() from e

app.py:

from domain.weekday import Weekday


if __name__ == '__main__':
    print(Weekday.MONDAY.value)

    print('done!')

test_weekday.py:

from unittest import TestCase

from api.domain import weekday
from api.domain.weekday import Weekday


class StateTests(TestCase):
    def test_validParsing(self):
        self.assertEqual(weekday.parse('mon'), Weekday.MONDAY)
        self.assertEqual(weekday.parse('tue'), Weekday.TUESDAY)
        self.assertEqual(weekday.parse('wed'), Weekday.WEDNESDAY)
        self.assertEqual(weekday.parse('thu'), Weekday.THURSDAY)
        self.assertEqual(weekday.parse('fri'), Weekday.FRIDAY)

    def test_invalidParsing(self):
        with self.assertRaises(weekday.InvalidValue):
            weekday.parse('invalid value')

以下是我的 Python 特定 VS Code 设置:

"python.languageServer": "Microsoft",
"python.linting.pylintEnabled": true,
"python.linting.pylintUseMinimalCheckers": false,
"python.linting.pylintArgs": [
    "--disable=C0111"
],
"python.pythonPath": "C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python38\\python.exe",
"python.linting.mypyCategorySeverity.note": "Warning",
"python.linting.mypyEnabled": true

我用python api/app.py 运行我的普通Python 应用程序,用python -m unittest -f 运行我的测试。

在我上面的普通 Python 项目中,我收到以下错误和警告(测试没有报告任何问题,这很奇怪):

app.py
    ERROR: Unable to import 'domain.weekday' pylint(import-error)
    WARNING: unresolved import 'domain.weekday' Python(unresolved-import)

在我的 Python Chalice 项目中,我收到以下错误和警告:

app.py
    ERROR: Unable to import 'domain' pylint(import-error)
    WARNING: unresolved import 'domain' Python (unresolved-import)
test_weekday.py
    ERROR: Unable to import 'api.domain' pylint(import-error)
    ERROR: Unable to import 'api.domain.weekday' pylint(import-error)

同样,两个应用都运行良好,我的所有测试都通过了。

我尝试将以下内容添加到我的.vscode/settings.json,但没有帮助:

{
    "python.autoComplete.extraPaths": [
        "./api",
        "./tests"
    ],
}

如何配置 Pylint 以在此项目结构中正常工作?

【问题讨论】:

    标签: python visual-studio-code warnings pylint


    【解决方案1】:

    我创建了与您提供的文件夹结构相同的项目,以及相同的设置。除了 pylint 警告之外没有错:

    添加以下设置可以禁用这些警告:

        "python.analysis.disabled": [
            "unresolved-import",
        ],  
        "python.linting.pylintArgs": [
            "----extension-pkg-whitelist=1xml"
        ],
    

    更多关于pylint的详细信息,请参考Readable Pylint Messages

    [编辑]

    设置"python.languageServer": "Jedi",也可以禁用这些警告。

    或者在launch.json中添加配置:

    【讨论】:

    • 我不知道,禁用警告感觉不对。如果发生合法的未解决导入怎么办?非常感谢分享,不过! :)
    • 这些警告不会影响项目执行,因此禁用它们是可以的。另一种方法是将语言服务器更改为 Jedi,我已经编辑了我的答案。请看一下。
    • 不,不。警告当然不会影响项目执行,但它们的存在是有原因的。如果发出警告,则意味着代码存在根本性错误。我正在寻找能够解决这些错误警告的答案,而不是直接禁用它们。
    • 那是因为这些模块不在同一个文件夹中。保持你的设置不变并在launch.json中添加"env": { "PYTHONPATH":"${workspaceFolder}", },,然后重新加载窗口。这适用于我的机器。
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多