主页 python导包从入门到精通 正文

python导包从入门到精通

作者:bcm   更新时间:2019年12月2日 18:09   


关于python导包在很多人看来是一件很轻松的事情,然而这种感觉对很多人造成了误导。python包的结构是什么,导包路径是什么意思,__init__.py是什么,导包有没有顺序?这些潜藏的疑问,等待被挖掘。

关于包结构

python 包结构是很好辨认的,初学者总是栽倒在创建包上。当离开IDE的自动提示,便不自觉的创建一个文件夹。然而要注意的是,在文件夹下面有一个__init__.py的文件,而后所有的导包将从这里开始。

import 解读

假设我们有如下这个程序

student 下面有个role.py脚本 ,在 role.py当中有两个成员,monitor和member

def monitor():
    return 'monitor'

def member():
    return 'member'

现在,我们在test.py执行如下程序

from exportpackage.student.role import monitor, member
print(monitor(), member())

到此为止,导包基础学完了。

关于 . 和 ..

一个点表示当前路径,两个点表示上级路径。这种认识似乎是没有错的,但是要更正的是,python当中的一个点表示当前模块,两个点则表示上级模块。这里所说的模块也就是上面说的包。然而在python当中,把它叫做模块似乎更合适。一个大的模块下面分了很多小模块(脚本文件)

正如上面的程序,现在换一种导入模块的方式。

from .student.role import monitor, member

print(monitor(), member())

当运行这个test脚本的时候,意外发生了。

Traceback (most recent call last):
  File "C:\python36\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\python36\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\code\learningPy\exportpackage\test.py", line 1, in <module>
    from .student.role import monitor, member
ImportError: attempted relative import with no known parent package

按照' . '表示当前目录的说法,说不通了,在这里,student 确实和test.py同级。

所以必须找到一种合理的解释,那就是这个点表示当前模块。python 脚本在执行的时候,python不会吧脚本所在目录当成一个模块,尽管它下面有__init__.py。test.py仅仅是一个程序运行的入口而已,它的文件夹也成为一个普通的文件夹。所以此时执行test.py的时候,python在当前目录上找不到student这个文件夹了,因为它自身就不是一个模块。

而要这个入口作为python的模块运行,python有个专门的语法。

python -m exportpackage.test

m表示指定一个模块,此时就正确执行了

sys.path

在这块需要解释下 os 模块和 sys 了,在python 中 os 封装了操作系统一些api,而sys则是python解释器的一些操作。例如。os.path表示系统下的文件路径,而sys.path表示可执行脚本的待选目录。

加入再把上面test.py脚本改造下。

from role import monitor, member
print(monitor(), member())

此时运行,不出所料是找不到role的,因为role在student里面,这时候需要sys.path的帮助了。

import sys
sys.path.append('./student')

from role import monitor, member
print(monitor(), member())

这样把待选脚本role.py加入系统路径当中,就可以找到 role了,此时也正常导入。

如果打印下sys.path就会发现,它是一个列表的存在。此时明白,sys.path就是维护着脚本的可查找目录,只有把一个模块的文件夹加入此列表,python才能找到要执行的文件。

python 导包顺序

....


目录

关于站点

变饼档 变饼档 头条号 微信号

@变饼档

网站备案/许可证号 陕ICP备17000772号-1

联系邮箱 942242856@qq.com


@技术支持

前端 layui,jquery,vue

后端 django,django-simpleui