如何在 VS Code 中正确导入 Python 模块?
How to correctly import a Python module in VS Code?
我最近开始在 Python 中编程,我决定在 Python 中编写一些 Delphi 函数。我决定创建一个包含我的功能的 Python 模块。
现在,我尝试导入它,但在 Visual Studio 代码中出现此错误:
unable to import 'functions' pylint(import error) [5, 1]
这是我的代码:
import sys
sys.path.append('/Users/user123/Desktop/Python/Functions/')
import functions
这是一张图片:
最简单的例子是:
.
├── 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 中的精彩 QA,其中有很多关于如何使用不同方法解决同一问题的重要信息。
希望对您有所帮助!
鉴于您的 file/folder 结构:
├── Functions
│ └── functions.py
├── <main app folder>
│ └── app.py
尽管将 path/to/Functions
添加到 sys.path
后您的导入可能 运行 正确,但 Pylint 会向您发出警告,因为这不是推荐的导入声明方式,尤其是当您在应用 外部 导入模块时 package/folder.
来自PEP8 Style Guide for Imports:
Absolute imports are recommended, as they are usually more readable
and tend to be better behaved (or at least give better error messages)
if the import system is incorrectly configured (such as when a
directory inside a package ends up on 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
还是 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 工作的变通方法。如果您可以使用我在开始时解释的推荐方式,请改用它。
我最近开始在 Python 中编程,我决定在 Python 中编写一些 Delphi 函数。我决定创建一个包含我的功能的 Python 模块。
现在,我尝试导入它,但在 Visual Studio 代码中出现此错误:
unable to import 'functions' pylint(import error) [5, 1]
这是我的代码:
import sys
sys.path.append('/Users/user123/Desktop/Python/Functions/')
import functions
这是一张图片:
最简单的例子是:
.
├── 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 中的精彩 QA,其中有很多关于如何使用不同方法解决同一问题的重要信息。
希望对您有所帮助!
鉴于您的 file/folder 结构:
├── Functions
│ └── functions.py
├── <main app folder>
│ └── app.py
尽管将 path/to/Functions
添加到 sys.path
后您的导入可能 运行 正确,但 Pylint 会向您发出警告,因为这不是推荐的导入声明方式,尤其是当您在应用 外部 导入模块时 package/folder.
来自PEP8 Style Guide for Imports:
Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on
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
还是 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 工作的变通方法。如果您可以使用我在开始时解释的推荐方式,请改用它。