我最近开始用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
这是一张图片:
答案 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
重命名为其他名称。这是因为在某些不区分大小写的系统上,导入Functions
和functions
可能会被视为同一模块。当您告诉PyLint调查/path/to/Functions
(我将在后面显示)时,可能无法区分copy
和delete
是Functions
还是{的一部分{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中阅读出色的质量检查,其中有很多有关如何使用不同方法解决同一问题的重要信息。
我希望它能对您有所帮助!