Python的模块、包等概念的理解
python包、模块与文件系统的对应关系
包:对应于文件夹,模块:文件
导入模块
模块搜索路径
导入一个叫spam的模块时,解释器先在当前目录中搜索名为spam.py的文件,然后在环境变量PYTHONPATH指向的目录列表中搜索,然后是环境变量PATH中的路径列表。如果PYTHONPATH没有设置,或者文件没有找到,接下来搜索安装目录,在UNIX中,通常是 /usr/local/lib/python。
实际上,解释器由sys.path变量指定的路径目录搜索模块,该变量初始化时默认包含了输入脚本(或者当前目录),PYTHONPATH和安装目录
sys.path.append(modulepath)
使用该方法加入sys.path只能在运行时,下次运行编译器时就不存在,这里modulepath可以是包含.py/pyc/pyo/pyw等文件的zip或egg
__init__.py
模块import前都会调用该文件
因此,可以在__init__.py文件中定义__all__
__all__
通过定义列表__all__,模块可以精确控制from module import *导入的名称集合,比如
module.py
__all__ = [‘bar’, ‘SomeClassName’, ‘SomeProperty’, ‘SomeFunction’]
from . import somemodule
.表示与调用模块相同的目录
..表示上级模块,比如from .. import somemodule
单独导入包名称不会导入包中所包含的子模块,比如:
import somepack
somepack.somemodule(xx) #失败!
但由于import somepack会执行somepack下的__init__.py,所以如果__init__.py中有
from . import somemodule之类的语句,则somepack.somemodule(xx)可以执行。
分发
一定的格式规范:
添加setup.py文件
文件格式
python并非完全是解释性语言,它是有编译的,先把源码py文件编译成pyc或者pyo,然后由python的虚拟机执行,相对于py文件来说,编译成pyc和pyo本质上和py没有太大区别,只是对于这个模块的加载速度提高了,并没有提高代码的执行速度,通常情况下不用主动去编译pyc文件,文档上说只要调用了import model那么model.py就会先编译成pyc然后加载
py与pyc的区别
pyc:预编译过的
pyo
优化的预编译
python -O -m py_compile file.py
py与pyw的区别
Windows下.py用 python.exe 运行,.pyw用 pythonw.exe 运行
跟 python.exe 比较起来,pythonw.exe 有以下的不同:
1)执行时不会弹出控制台窗口(也叫 DOS 窗口)
2)所有向原有的 stdout 和 stderr 的输出都无效
3)所有从原有的 stdin 的读取都只会得到 EOF
.pyw 格式是被设计来运行开发完成的纯图形界面程序的。
纯图形界面程序的用户不需要看到控制台窗口。
参考资料: