如何在 VS Code 中正确导入 Python 模块?

Rom*_*ans 8 pylint python-3.x visual-studio-code

我最近开始用 Python 编程,我决定用 Python 编写一些 Delphi 函数。我决定创建一个单独的 Python 模块来保存我的函数。

现在,我尝试导入它,但在 Visual Studio Code 中出现此错误:

unable to import 'functions' pylint(import error) [5, 1]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

unable to import 'functions' pylint(import error) [5, 1]
Run Code Online (Sandbox Code Playgroud)

这是一张图片:

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

Gin*_*pin 12

鉴于您的文件/文件夹结构:

??? Functions
?   ??? functions.py
??? <main app folder>
?   ??? app.py
Run Code Online (Sandbox Code Playgroud)

尽管您的导入在添加path/to/Functions到 后可能会正确运行sys.path,但 Pylint 会向您发出警告,因为这不是声明导入的推荐方式,尤其是当您在应用程序包/文件夹之外导入模块时。

来自PEP8 导入样式指南

建议使用绝对导入,因为如果导入系统配置不正确(例如当包内的目录结束时sys.path),它们通常更具可读性并且往往表现更好(或至少给出更好的错误消息):

import mypkg.sibling 
from mypkg import sibling 
from mypkg.sibling import example
Run Code Online (Sandbox Code Playgroud)

推荐的解决方案是通过在其下添加文件来设置Functions为包__init__.py

??? parent
?   ??? Functions
?       ??? __init__.py
?       ??? functions.py
Run Code Online (Sandbox Code Playgroud)

然后导入您的功能,如以下之一:

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()
Run Code Online (Sandbox Code Playgroud)

这两个选项都应该正确运行并满足 PyLint。

现在,如果您真的想执行像 那样的非绝对导入from functions import func,并让 PyLint 接受,我建议您重命名functions.py为其他名称。这是因为,在某些不区分大小写的系统上,导入Functionsfunctions可能会被视为同一个模块。当您告诉 PyLint 进行查看时/path/to/Functions(我稍后会展示),它可能无法区分copydelete是否属于Functionsfunctions,并且它可能仍会显示导入错误。

所以,你需要做的是重命名functions.py(例如filefuncs.py):

import mypkg.sibling 
from mypkg import sibling 
from mypkg.sibling import example
Run Code Online (Sandbox Code Playgroud)

然后在您的 VS Code 工作区中,将其添加到您的.vscode/settings.json文件中,以告诉 PyLint 在哪里查找filefuncs模块:

??? parent
?   ??? Functions
?       ??? __init__.py
?       ??? functions.py
Run Code Online (Sandbox Code Playgroud)

然后你现在可以像你的原始代码一样导入它,但没有 PyLint 错误:

sys.path.append("/path/to/Functions")
from filefuncs import copy, delete
copy()
delete()
Run Code Online (Sandbox Code Playgroud)

第二种方法可以满足您的需求,但它包含一些 PyLint 工作的变通方法。如果您可以使用我在开始时解释的推荐方式,请改用它。