包
包
导入模块的方法
创建目录结构
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
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#文件内容
#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
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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
第四种方法 —— 相对路径导入的方式
只关心相对自己当前目录位置的模块位置就好
不能在包的内部直接执行
不管根节点在哪,包内的模块相对位置都是正确的
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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__的相关性搞出来的一种包定制
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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()