一、模块:
1.简单的描述:一个.py文件
2.好处:大大提高代码的可维护性
3.模块三种:1.python标准库
2.第三方模块
3.应用程序自定义模块(*****)
4.import实质就是:1.执行对应文件 2.引入变量名
在内置函数中__import__导入文件的时候与import不同
import spam
spam = __import__('spam', globals(), locals(), [], 0)
5.导入模块其实就是告诉Python解释器去解释那个py文件
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 # import module_test 6 # from module_test import xx 7 # from module_test import xx as rename 8 # from module_test import * 不推荐 容易覆盖
二、包
1.避免模块名重复,组织模块的 init文件
2.导入一个包,就是告诉解释器解释该包下的 __init__.py 文件
<1>创建一个package_name的文件夹嵌套包web如图:
(1)创建一个cal.py文件代码如下
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 def add(x, y): 6 return x+y 7 8 9 print(__name__)
(2)再创建test.py文件
导入模块cal.py方式:
三种常规导入:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import sys 5 import os 6 from web.web1.web2 import cal 7 # from web.web1.web2.cal import add 8 # from web.web1 import web2 # 就是在执行web2的init的文件 不支持调用方式除非在web2下init文件里边添加cal的导入路径
调用模块的函数:在第三种导入方式就会报错
1 # print(cal.add(2, 3)) 2 # print(add(2, 3)) 3 # print(web2.cal.add(2, 3)) # 报错AttributeError: module 'web.web1.web2' has no attribute 'cal' 4 # print(web2.cal.add(2, 3)) # web2下在init文件下导入了模块cal
web2包下的__init__.py文件
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from . import cal
解释器只认识sys.path里边的路径
1 # print(sys.path) # 解释器只认识sys.path里边的路径,看解释器路径 2 # ['F:\\abc\\todostart\\package_name',.....] 打印一堆路径 3 4 # print(__name__) # __main__ 5 # 在cal文件下打印print(__name__) 执行文件test.py web.web1.web2.cal __main__ 6 7 # if __name__ == '__main__':1.放在cal中测试文件功能1:用于被调用文件的测试 8 # 2.在执行文件test.py中加上 可以调用我的程序 但是不能执行我的run_test()主函数 9 10 # print(__name__)放在调用文件中main 放在被调用文件中就是文件名
1 def run_test(): 2 print('......') 3 4 5 if __name__ == '__main__': 6 run_test() 7 print(__file__) 8 print(os.path.dirname(__file__)) 9 print(os.path.dirname(os.path.dirname(__file__))) 10 print(os.path.dirname(os.path.abspath(__file__))) 11 """ 12 dirname 拿到此文件的上一级目录 13 abspath绝对路径 14 web.web1.web2.cal 15 ...... 16 F:/abc/todostart/package_name/test.py 17 F:/abc/todostart/package_name 18 F:/abc/todostart 19 F:\abc\todostart\package_name 20 """