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

时间:2020-01-12 08:39:34

标签: python-3.x visual-studio-code pylint

我最近开始用Python编程,并且我决定用Python编写一些Delphi函数。我决定创建一个包含我的函数的Python模块。

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

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 个答案:

答案 0 :(得分:9)

给出您的文件/文件夹结构:

├── Functions
│   └── functions.py
├── <main app folder>
│   └── app.py

尽管将path/to/Functions添加到sys.path后,导入操作可能会正确运行,但是Pylint会警告您,因为这不是建议的声明导入方法,尤其是在导入模块时外部应用包/文件夹。

来自PEP8 Style Guide for Imports

建议绝对导入,因为它们通常更易读 并表现得更好(或至少给出更好的错误信息) 如果导入系统配置不正确(例如 包内的目录以sys.path结尾)

import mypkg.sibling 
from mypkg import sibling 
from mypkg.sibling import example

推荐的解决方案是在setup Functions as a package下添加一个__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重命名为其他名称。这是因为在某些不区分大小写的系统上,导入Functionsfunctions可能会被视为同一模块。当您告诉PyLint调查/path/to/Functions(我将在后面显示)时,可能无法区分copydeleteFunctions还是{的一部分{1}},并且可能仍然显示导入错误。

因此,您需要做的是重命名functions(例如functions.py):

filefuncs.py

然后在VS Code工作区中,将其添加到您的 .vscode / settings.json 文件中,以告诉PyLint在哪里寻找├── Functions │ └── filefuncs.py ├── <main app folder> │ └── app.py 模块:

filefuncs

然后,您现在可以将其导入为与原始代码相同的内容,但没有PyLint错误:

"python.linting.pylintArgs": [
    "--init-hook",
    "import sys; sys.path.append('/path/to/Functions')"
]

第二种方法可以满足您的需要,但是它包含一些使PyLint起作用的解决方法。如果您可以使用我在开始时说明的推荐方法,请改用该方法。

答案 1 :(得分:2)

最简单的示例是:

.
├── 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

有关如何执行此操作的更多详细信息,您可以在beyond top level package error in relative import中阅读出色的质量检查,其中有很多有关如何使用不同方法解决同一问题的重要信息。

我希望它能对您有所帮助!