python--包的导入

1,包

定义:把解决一类问题的模块放在同一个文件夹里 

导入语法:在import    from...import导入语句中(而不是在使用时)遇到带点

本质:就是一个包含__init__.py文件的目录,在py2中,必须有__init__.py文件,py3没有也可以执行。包只是模块的一种形式而已,包即模块,是为了导入方便使用,2.

2,导入包的两种方式:

使用绝对路径 不管在包内部还是外部 导入了就能用
不能挪动,但是直观
绝对路径:以glance作为起始
可以随意移动包 只要能找到包的位置,就可以使用包里的模块
包里的模块如果想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了
相对路径
相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
相对导入只能用from的形式。
from ..cmd import manage
        manage.main()

3,自己创建一个包

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/__init__.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)

4,创建完包之后,导入模块。但有一种导入模块方式是不对的

import glance
glance.cmd.manage.get()
glance.api.policy.get()
glance.db.models.get()
分析错误原因:
这种导入包的模式是错误的,因为glance导入后,sys.path中只有到glance上一级的目录,
可以通过sys.path 查看,而在glance.cmd.manage.get() 调用的时候,
glance执行它的__inint__,找不到cmd/api/db文件, 所以要在每一层的init分别导入关联路径

 解决方发:

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
解决方法

 5,import glance之后直接调用模块中的方法

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()
 

 6,软件开发规范

原文地址:https://www.cnblogs.com/zzy-9318/p/8278938.html