导入模块的方法

创建目录结构

复制代码
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()
原文地址:https://www.cnblogs.com/QQ279366/p/7886667.html