Как правильно импортировать модуль Python в VS Code? - PullRequest
0 голосов
/ 12 января 2020

Я недавно начал программировать в Python и решил кодировать некоторые Delphi функции в Python. Я решил создать один модуль Python, который будет содержать мои функции.

Теперь я попытался импортировать его, но я получаю эту ошибку в коде Visual Studio:

unable to import 'functions' pylint(import error) [5, 1]

Вот мой код:

import sys

sys.path.append('/Users/user123/Desktop/Python/Functions/')

import functions

Вот изображение:

https://i.stack.imgur.com/5EGbk.jpg

Ответы [ 2 ]

1 голос
/ 12 января 2020

Простейшим примером будет:

.
├── functions
│   ├── functions.py
└── main
    └── main.py

Теперь в functions/functions.py у меня есть:

from datetime import datetime

def print_datetime():
    print(datetime.utcnow())

, а в main/main.py у меня:

import sys
sys.path.append(".")

from functions.functions import print_datetime

if __name__ == '__main__':
    print_datetime()

Этот sys.path.append(".") помогает вам переключать контекст, из которого вы вызываете main.py, чтобы быть более точным, он добавляет более высокий каталог к ​​python пути модулей.

И пока вы находитесь в В каталоге верхнего уровня проекта, теперь вы можете запустить main.py, который даст такой результат:

(venv) user@pc: .../59702230 
$ python main/main.py 
2020-01-12 09:51:01.469436

Для получения более подробной информации о том, как это сделать, вы можете прочитать отличный QA в ошибка пакета верхнего уровня в относительном импорте , где много полезной информации о том, как решить одну и ту же проблему с помощью различных подходов.

Я надеюсь, что это поможет вам!

0 голосов
/ 12 января 2020

Учитывая структуру вашего файла / папки:

├── 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. Если вы можете использовать рекомендованный способ, который я объяснил в начале, используйте его вместо этого.

...