Python–cookbook–10.模块与包
相关介绍
# coding=utf8
# 构建一个模块的层级包
# 确保每个目录都定义了一个 __init__.py 文件
# 绝大部分时候让 __init__.py 空着就好。但是有些情况下可能包含代码。例如__init__.py 能够用来自动加载子模块
# 控制模块被全部导入的内容
# 在你的模块中定义一个变量 __all__ 来明确地列出需要导出的内容
# somemodule.py
# 使用相对路径名导入包中子模块
# from mypackage.A import grok # OK
# from . import grok # OK
# 将模块分割成多个文件
# 分割成__init__.py a.py b.py
# class A:
# def spam(self):
# print('A.spam')
# class B(A):
# def bar(self):
# print('B.bar')
# super().spam()
# 利用命名空间导入目录分散的代码
# foo-package/
# spam/
# blah.py
# bar-package/
# spam/
# grok.py
# 包命名空间的关键是确保顶级目录中没有 __init__.py 文件来作为共同的命名空间
# import sys
# sys.path.extend(['foo-package', 'bar-package'])
# import spam.blah
# import spam.grok
# 重新加载模块
# import somemodule
# import imp
# imp.reload()
# 运行目录或压缩文件
# 有一个已成长为包含多个文件的应用,它已远不再是一个简单的脚本,你想向用
# 户提供一些简单的方法运行这个程序
# 把应用程序放进它自己的目录并添加一个 __main__.py 文件
# myapplication/
# spam.py
# bar.py
# grok.py
# __main__.py
# 命令 python3 myapplication
# 解释器将执行 __main__.py 文件作为主程序
# 压缩同样适用
# 命令 python3 myapp.zip
# 读取位于包中的数据文件
# mypackage/
# __init__.py
# somedata.dat
# spam.py
# import pkgutil
# data = pkgutil.get_data(__package__, 'somedata.dat')
# 将文件夹加入到sys.path
# 第一种使用 PYTHONPATH环境变量来添加
# bash % env PYTHONPATH=/some/dir:/other/dir python3
# 第二种方法是创建一个.pth 文件,将目录列举出
# 这个.pth 文件需要放在某个 Python 的 site-packages 目录,通常位于/usr/local/
# lib/python3.3/site-packages 或者 ~/.local/lib/python3.3/sitepackages
# myapplication.pth
# /some/dir
# /other/dir
# 第三种,手动调节 sys.path 的值,虽然这能“工作”,它是在实践中极为脆弱,应尽量避免使用
# import sys
# sys.path.insert(0, '/some/dir')
# sys.path.insert(0, '/other/dir')
# 通过字符串名导入模块
# 想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令
# import importlib
# math = importlib.import_module('math')
# print(math.sin(2))
# 通过钩子远程加载模块
# 导入模块的同时修改模块
# 你想给某个已存在模块中的函数添加装饰器。不过,前提是这个模块已经被导入并且被使用过
# 安装私有的包
# python3 setup.py install --user
# pip install --user packagename
# 创建新的 Python 环境
# 分发包
# 已经编写了一个有用的库,想将它分享给其他人
# from distutils.core import setup