模块和包
模块
模块定义:模块就是一个保存python代码的文件
import :导入一个整体的模块
from :从一个模块中获取一个特定的内容
reload:在不终止python程序的情况下,重新导入模块文件内容的方法。
备注:
一般导入模块的语句都是写在文件的顶部,一个模块只需导入一次就好。
交互模式下,os.getcwd()的路径 必须和这个模块文件的路径处于同一级,否则在import的时候会找不到
程序找包的过程: #1 会在当前目录下进行查找import 的模块文件 #2 去pythonpath下面的所有路径下,去找import 的模块文件 #3 最后 python的安装路径C:\Python36\Lib\site-packages的目录下去找 如果1/2/3/4都没有找到,则报没有这个模块 解决方案: 1 把模块文件和当前执行的python文件放到同一个文件夹下后,在执行 2 把模块文件的所在绝对路径添加到操作系统的环境变量中 3 或者 import sys sys.path.append("你的模块文件所在的绝对目录") import 你自己写的包名/模块名 # 注意这个要写在后面才能导入成功 4.把模块放在 ..Python36\Lib\site-packages 这个文件夹下面就可以直接 import 模块名 # 这个是用于包和模块的引用才用到,不要和 执行文件 py -3.6 D:\\test.py 搞混了,执行文件还是要写路径的 # 一般是用于文件里面引入另一个文件 包和模块的区别: 1 模块是个python文件 2 包是个目录,目录里面必须有__init__.py文件 3 包下面可以有子包和模块 # 包的查找方式和模块是一样的。 在__init__.py文件中写入的内容 __all__ = ['a'] # 允许导入的模块
globals()和locals()函数
根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。
def foo(): print("calling foo()...") aStr = "bar" anInt = 23 print("foo()'s globals:", globals().keys()) print("foo()'s locals:", locals().keys()) print("__main__'s globals:", globals().keys()) print("__main__'s locals:", locals().keys()) foo() 结果: __main__'s globals: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'foo']) __main__'s locals: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'foo']) calling foo()... foo()'s globals: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'foo']) foo()'s locals: dict_keys(['aStr', 'anInt'])
包
包是一个分层的文件目录结构,它定义了一个由模块及子包和子包下的子包等组成的Python的应用环境。
包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹被当作包使用时,文件夹中需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。
__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在frompackage-name import *这语句使用的,表示全部导出定义过的模块。如果希望调用同一个package中的module,则直接import即可。
包的相对路径
如果是子包内的引用,可以按相对位置引入子模块 以 b 模块为例,可以引用如下:
1 、from . import a # 同级目录 导入 a
2 、from .. import test2 # 上级目录 导入 test2
3 、from ..test2 import d # 上级目录的test2模块下 导入 d
if __name__ == "__main__": print(100) # 只有当执行文件的时候才会执行 if 下面的语句 py -3.6 a.py # 当作模块导入的时候不会执行 import a