模块
module也是对象, 通过module名访问模块中的属性(包的属性放在包下的__init__.py
文件中), 私有属性也可以访问到
可以通过module.__dict__
或dir(module)
, dir()
查看当前模块名词空间,即module的所有属性
普通目录Directory和Package区别,就是Package下有一个__init__.py
package 也是模块, 在init.py中定义属性,只是表达一种层级关系(hierarchy),父子模块通过相对路径可以互相访问到
载入子模块一定会载入父模块, 载入父模块一定不会载入子模块, 导入模块会被顺序执行
sys.modules
-> 系统已加载模块的字典
sys.path
-> 导入模块的搜索顺序, 返回list, 只搜索目录中文件,不会递归搜索, 先当前包目录, 再当前项目目录, 标准库, 第三方库
模块的特殊属性:
__file__ | 源文件路径
__cached__ | 编译后的字节码文件路径
__spec__ | 模块的规范,规格,specification,
__name__ | 模块名
__package__ | 模块所属的包名
import os.path
path模块: Instead of importing this module directly, import os and refer to this module as os.path.
各种模块导入形式:
- from mod import mod1 as m 名词空间只增加m
- from mod.mod1 import attribute/mod2 添加单个成员或mod, 名词空间只添加import后的成员标识符, 标识符查找属性优先,找不到再找mod 推荐使用
- import mod.mod1.mod2 名词空间添加顶层mod标识符, mod1和mod2都可以通过
.
的方式访问到 - import mod.mod1 as m 只有as后的标识符放入名词空间,绑定import后的整体
- from mod.mod1 import * mod1(mod.py文件或
__init__
.py文件)中所有非下滑线开头属性,包括mod1中导入的模块的标识符, 都加入当前名词空间
在module中定义__all__
={‘x’,’os’}属性, 指定使用用*
号导出时, 所导出的所有属性名
使用__all__
import时,module只会载入(初始化)一次,
__init__.py
只会执行一次
模块被import时, 会顺序执行, 和作为__main__
模块执行, 名词空间有区别
如果一个模块是一个包,就存在import语句中载入自己的情况
如果一个包被import执行时,import到自己下面的包(分为import mod.和from mod.), 名词空间就在原有逻辑上增加一个自己.
后的下一个模块
相对导入 ., .., ...,
只能在包内使用,且只能用在from语句中
包内能用相对路径导入就用相对路径导入
如果一个包被import执行时,import到自己下面的包(只在import mod.),并且使用as子句,就会报错 X?
执行模块的__name__
被改成__main__
, 相对导入的起始模块就是__name__
名的模块,所以存在相对导入的模块,作为主模块执行时会报导入错误(导入前将__name__
修改,就不会了)
使用if __name__ == __main__:
当模块作为主模块是才执行的代码
插件化开发, 动态载入模块
mod = __import__('sys') # 等价于import sys as mod # not for general use
importlib.import_module(name, package=None) # encourage use
`package`设置相对路径起始位置
打包分发
distribution
Pypi(Python Package Index),公共模块存贮中心,http://pypi.python.org/pypi
distutils
setuptools
pip
wheel 可以让python以二进制形式安装,而不需要本地编译
使用setup.py打包
#!/usr/bin/env python
# from setuptools import setup #wheel
from distutils.core import setup
setup(name='Distutils',
version='1.0',
description='Python Distribution Utilities',
author='Greg Ward',
author_email='[email protected]',
url='https://www.python.org/sigs/distutils-sig/',
packages=['distutils', 'distutils.command'],
data_files=['file_pathname',...] # 批量导入 glob.glob('path/*.html')
)
python setup.py –help
python setup.py build 生成
python setup.py install 安装
python setup.py sdist –> 源码zip文件 ,解压可以用setup.py install安装,也可以pip install zip文件
python steup.py sdist –help-formats 查看所有支持的打包格式
python setup.py bdist_wininst 制作windows下的分发包,二进制
python setup.py bdist_rpm 打包成rpm,二进制
python setup.py bdist_wheel 打包成whl,二进制