模块和路
一.模块
二.包
1.模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
2.模块的导入
1.1import,自定义模块my_modules
print('哈哈') name='刘晓蕾' def read1(): print('我来自my_modules read1') def read2(): print('我来自my_modules read2',name)
成功导入
import my_module #我来自 my_module 哈哈
1.2重复导入模块无意义
它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下
import my_module import my_module import my_module import my_module #我来自 my_module 哈哈(只执行一次)
python内部是如何分辨模块已经被导入了
import sys print(sys.modules) #sys.modules 是字典 如果模块名已存在,则不用重复导入
1.3命名空间
import my_module name='你好' print(my_module.name) print(name) # 我来自 my_module 哈哈 # 刘晓蕾 # 你好
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

1.4为变量起别名
import my_module as m print(m.name) # 我来自 my_module 哈哈 # 刘晓蕾 print(my_module.name) #NameError: name 'my_module' is not defined
#起了别名原来的就不能用了
#起别名的应用 def func(dic,t = 'json'): if t == 'json': import json return json.dumps(dic) elif t == 'pickle': import pickle return pickle.dumps(dic) # 简化代码 def func(dic, t='json'): if t == 'json': import json as way elif t == 'pickle': import pickle as way return way.dumps(dic)
1.5一行导入多个模块 内置模块 第三方模块 自定义模块
import 模块一,模块二....
2.from ....import.....
name='哈哈' from my_module import name print(name) 我来自 my_module 哈哈 刘晓蕾
name='哈哈' import my_module print(name) #哈哈 print(my_module.name) #刘晓蕾
from my_module import name
name='哈哈'
print(name)

from my_module import read1,read2
from my_module import * 把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。
在my_module.py中新增一行
__all__=['money','read1'] #这样在另外一个文件中用from my_module import *就这能导
入列表中规定的两个名字
3.把模块当脚本执行
# 当一个py文件(只有一个py文件)
# 当做一个脚本的时候,能够提供一个独立功能
# 当做一个模块的时候,能够被调用这个函数功能
我们可以通过模块的全局变量__name__来查看模块名:
当做脚本运行:
__name__ 等于'__main__'
当做模块导入:
__name__= 模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':
4.搜索模块路径
import sys
print(sys.path)#执行文件的路径,如果定义在路径下,那都认识
2.包
2.1从包中导入模块(执行__init__)
示例一在run中导入glance/api/policy(此时glance与run在同级目录下)

glance/ #Top-level package ├── __init__.py #Initialize the glance package ├── api #Subpackage for api │ ├── __init__.py │ ├── policy.py │ └── versions.py ├── cmd #Subpackage for cmd │ ├── __init__.py │ └── manage.py └── db #Subpackage for db ├── __init__.py └── models.py 目录结构
import os os.makedirs('glance/api') os.makedirs('glance/cmd') os.makedirs('glance/db') l = [] l.append(open('glance/__init__.py','w')) l.append(open('glance/api/__init__.py','w')) l.append(open('glance/api/policy.py','w')) l.append(open('glance/api/versions.py','w')) l.append(open('glance/cmd/__init__.py','w')) l.append(open('glance/cmd/manage.py','w')) l.append(open('glance/db/models.py','w')) map(lambda f:f.close() ,l) 创建目录代码
#文件内容 #policy.py def get(): print('from policy.py') #versions.py def create_resource(conf): print('from version.py: ',conf) #manage.py def main(): print('from manage.py') #models.py def register_models(engine): print('from models.py: ',engine) 文件内容
方法一:导入glance中的polic(直接导入) from....import....(import导入的内容不可以带.)
import glance.api.policy # from glance __init__ # 我来自glance api policy
2.设置__init__文件
#glance __init__ from glance import api #glance api __init__ from glance.api import policy
导入语句:glance.api.policy.get()
3.可以添加api的地址到执行文件的sys.path中
path=r'C:\Users\ASUS\PycharmProjects\untitled3\模块与包的导入\glance\api' import sys sys.path.append(path) import policy #我来自glance api policy
实例二在run中 导入glance中api的policy(此时glance在与run同级的目录下)

方法一
import 起名真的难.glance.api.policy as h h.get() # from glance __init__ # 我来自glance api policy(print打印) # from policy.py
方法二:
import sys sys.path.append(r'C:\Users\ASUS\PycharmProjects\untitled3\模块与包的导入\起名真的难\glance') import api.policy as a a.get() # 我来自glance api policy # from policy.py
方法三:设置__init__文件
# 起名真的难__init__设置 import glance glance __init__ #glance __init__文件设置 from 起名真的难.glance import api #api __init__文件设置 from 起名真的难.glance.api import policy
import 起名真的难
起名真的难.glance.api.policy.get()
不能直接 policy.get()
因为:from 后面的才是导入的包
{'起名真的难': <module '起名真的难' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\__init__.py'>, '起名真的难.glance': <module '起名真的难.glance' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\glance\\__init__.py'>, '起名真的难.glance.api': <module '起名真的难.glance.api' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\glance\\api\\__init__.py'>, '起名真的难.glance.api.policy': <module '起名真的难.glance.api.policy' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\glance\\api\\policy.py'>}



浙公网安备 33010602011771号