包
导入模块的方法
创建目录结构
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

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

#文件内容 #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)
第一种方法
从包中直接导入模块
import glance.api.policy # 最后一个名字一定是模块名 glance.api.policy.get() # 使用:import后面的所有内容作为一个整体来使用
第二种方法
from glance.api import policy # 最后import的一定是模块名 policy.get()
处理__init__文件
第三种方法 —— 绝对路径导入的方式
所有的模块导入都从根节点开始
根节点的位置由sys.path中的路径决定
项目的根目录在sys.path中存在是因为pycharm的作用
如果希望程序能处处执行,需要手动修改sys.path

glance/ ├── __init__.py from glance import api from glance import cmd from glance import db ├── api │ ├── __init__.py from glance.api import policy from glance.api import versions │ ├── policy.py │ └── versions.py ├── cmd from glance.cmd import manage │ ├── __init__.py │ └── manage.py └── db from glance.db import models ├── __init__.py └── models.py
第四种方法 —— 相对路径导入的方式
只关心相对自己当前目录位置的模块位置就好
不能在包的内部直接执行
不管根节点在哪,包内的模块相对位置都是正确的

glance/ ├── __init__.py from . import api #.表示当前目录 from . import cmd from . import db ├── api │ ├── __init__.py from . import policy from . import versions │ ├── policy.py │ └── versions.py ├── cmd from . import manage │ ├── __init__.py │ └── manage.py from ..api import policy #..表示上一级目录,想再manage中使用policy中的方法就需要回到上一级glance目录往下找api包,从api导入policy └── db from . import models ├── __init__.py └── models.py
第五种方法 —— *和__all__的配合
利用from import * 和__all__的相关性搞出来的一种包定制

glance/ ├── __init__.py from .api import * from .cmd import * from .db import * ├── api │ ├── __init__.py __all__ = ['policy','versions'] │ ├── policy.py │ └── versions.py ├── cmd __all__ = ['manage'] │ ├── __init__.py │ └── manage.py └── db __all__ = ['models'] ├── __init__.py └── models.py import glance policy.get()
绝对导入:目录变换,包内代码的导入关系也会发生变化,但是在包内调用不会报错
相对导入:只能在包外部调用,不用关心包内代码的导入关系