Учитывая структуру вашего файла / папки:
├── Functions
│ └── functions.py
├── <main app folder>
│ └── app.py
Несмотря на то, что импорт может выполняться правильно после добавления path/to/Functions
в sys.path
, Pylint предупреждает вас об этом, потому что это не рекомендуется способ объявления импорта, особенно когда вы импортируете модули вне пакета / папки приложения.
Из Руководства по стилю PEP8 для импорта :
Рекомендуется абсолютный импорт, поскольку они обычно более читабельны и, как правило, ведут себя лучше (или по крайней мере лучше сообщать об ошибках), если система импорта настроена неправильно (например, когда каталог внутри пакета заканчивается на sys.path
):
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
Рекомендуемое решение - setup Functions
в виде пакета , добавив в него файл __init__.py
:
├── parent
│ └── Functions
│ ├── __init__.py
│ └── functions.py
и затем импортировав свои функции, например:
sys.path.append("/path/to/parent")
# option 1
from Functions import functions
functions.copy()
functions.delete()
# option2
from Functions.functions import copy, delete
copy()
delete()
Должны быть запущены обе опции правильно и удовлетворить PyLint.
Теперь, если вы действительно хотите выполнить неабсолютный импорт, такой как from functions import func
, и заставить PyLint принять это, я рекомендую переименовать functions.py
в другое. Это связано с тем, что в некоторых системах импорт Functions
и functions
может рассматриваться как семантически один и тот же модуль. Когда вы говорите PyLint посмотреть на /path/to/Functions
(я покажу позже), он не сможет различить, если copy
и delete
является частью Functions
или functions
, и он все еще может показывать ошибка импорта.
Итак, вам нужно переименовать functions.py
(например, filefuncs.py
):
├── Functions
│ └── filefuncs.py
├── <main app folder>
│ └── app.py
Затем в рабочем пространстве VS Code добавьте это в Ваш .vscode / settings. json файл, чтобы сообщить PyLint, где искать модуль filefuncs
:
"python.linting.pylintArgs": [
"--init-hook",
"import sys; sys.path.append('/path/to/Functions')"
]
Затем вы можете импортировать его так же, как ваш исходный код, но без ошибок PyLint:
sys.path.append("/path/to/Functions")
from filefuncs import copy, delete
copy()
delete()
Второй способ даст вам то, что вам нужно, но содержит некоторые обходные пути для работы PyLint. Если вы можете использовать рекомендованный способ, который я объяснил в начале, используйте его вместо этого.