python import导入模块

mac2024-08-08  59

简介

常规导入(regular imports) 使用from语句导入 相对导入(relative imports) 可选导入(optional imports) 本地导入(local imports)

1. 常规导入

常规导入 常规导入应该是最常使用的导入方式,大概是这样的:

import sys

你只需要使用import一词,然后指定你希望导入的模块或包即可。通过这种方式导入的好处是可以一次性导入多个包或模块:

import os, sys, time

虽然这节省了空间,但是却违背了Python风格指南。Python风格指南建议将每个导入语句单独成行。

有时在导入模块时,你想要重命名这个模块。这个功能很容易实现:

import sys as system

2. 使用from语句导入

很多时候你只想要导入一个模块或库中的某个部分。我们来看看在Python中如何实现这点:

from functools import lru_cache

3. 相对导入

具体来说,是使用句点来决定如何相对导入其他包或模块。 这么做的原因是为了避免偶然情况下导入标准库中的模块产生冲突。

my_package/ __init__.py subpackage1/ __init__.py module_x.py module_y.py subpackage2/ __init__.py module_z.py module_a.py

在本地磁盘上找个地方创建上述文件和文件夹。在顶层的__init__.py文件中,输入以下代码:

from . import subpackage1 from . import subpackage2

接下来进入subpackage1文件夹,编辑其中的__init__.py文件,输入以下代码:

from . import module_x from . import module_y

现在编辑module_x.py文件,输入以下代码:

from .module_y import spam as ham def main(): ham()

最后编辑module_y.py文件,输入以下代码:

def spam(): print('spam ' * 3)

打开终端,cd至my_package包所在的文件夹,但不要进入my_package。

In [1]: import my_package In [2]: my_package.subpackage1.module_x Out[2]: <module 'my_package.subpackage1.module_x' from 'my_package/subpackage1/module_x.py'> In [3]: my_package.subpackage1.module_x.main() spam spam spam

相对导入适用于你最终要放入包中的代码。如果你编写了很多相关性强的代码,那么应该采用这种导入方式。 PyPI上有很多流行的包也是采用了相对导入。 还要注意一点,如果你想要跨越多个文件层级进行导入,只需要使用多个句点即可。不过建议相对导入的层级不要超过两层。

注意事项: 如果你往module_x.py文件中添加了if __name__ == ‘__main__’,然后试图运行这个文件,你会碰到一个很难理解的错误。

from . module_y import spam as ham def main(): ham() if __name__ == '__main__': # This won't work! main()

现在从终端进入subpackage1文件夹,执行以下命令:

python module_x.py

如果Python 2,有下面的错误信息:

Traceback (most recent call last): File "module_x.py", line 1, in <module> from . module_y import spam as ham ValueError: Attempted relative import in non-package

如果是Python 3,错误信息大概是这样的:

Traceback (most recent call last): File "module_x.py", line 1, in <module> from . module_y import spam as ham SystemError: Parent module '' not loaded, cannot perform relative import

module_x.py是某个包中的一个模块,而你试图以脚本模式执行,但是这种模式不支持相对导入。

如果你想在自己的代码中使用这个模块,那么你必须将其添加至Python的导入检索路径(import search path)。最简单的做法如下:

import sys sys.path.append('/path/to/folder/containing/my_package') import my_package

注意,你需要添加的是my_package的上一层文件夹路径,而不是my_package本身。原因是my_package就是我们想要使用的包,所以如果你添加它的路径,那么将无法使用这个包。

import导入目录问题:

import导入其他模块时,需要导入的模块文件夹有__init__.py的文件。

如果,import的目录不在同一个文件或者相隔较远下,使用sys.path.append 添加目录。

在import的第一个阶段,主要是完成了查找要引入模块的功能。查找时首先检查 sys.modules (保存了之前import的类库的缓存),如果module没有被找到,则按照下面的搜索路径查找模块:

1.py 所在文件的目录 (2)PYTHONPATH 中的目录 (3)python安装目录,UNIX下,默认路径一般为/usr/local/lib/python/43.x 中.pth 文件内容

参考:

Python导入模块的几种姿势;PEP 366 – Main module explicit relative imports;导入系统;Python笔记03:python中用import导入包的机制原理是什么?
最新回复(0)