模块和路

 

 

一.模块

二.包

 

1.模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

2.模块的导入

1.1import,自定义模块my_modules

print('哈哈')
name='刘晓蕾'
def read1():
    print('我来自my_modules read1')
def read2():
    print('我来自my_modules read2',name)
my_modules

 成功导入

import my_module

#我来自 my_module 哈哈

 1.2重复导入模块无意义

它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下

import my_module
import my_module
import my_module
import my_module


#我来自 my_module 哈哈(只执行一次)

 

python内部是如何分辨模块已经被导入了

import sys
print(sys.modules)   #sys.modules  是字典
 
如果模块名已存在,则不用重复导入

 

1.3命名空间

import my_module
name='你好'
print(my_module.name)
print(name)

# 我来自 my_module 哈哈
# 刘晓蕾
# 你好

 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

1.4为变量起别名

import my_module  as m
print(m.name)
# 我来自 my_module 哈哈
# 刘晓蕾
print(my_module.name)  #NameError: name 'my_module' is not defined
#起了别名原来的就不能用了
#起别名的应用
def func(dic,t = 'json'):
    if t == 'json':
        import json
        return json.dumps(dic)
    elif t == 'pickle':
        import pickle
        return pickle.dumps(dic)
# 简化代码
def func(dic, t='json'):
    if t == 'json':
        import json as way
    elif t == 'pickle':
        import pickle as way
    return way.dumps(dic)

 

 1.5一行导入多个模块      内置模块  第三方模块  自定义模块

import 模块一,模块二....

 

 2.from ....import.....

 

name='哈哈'
from  my_module import name
print(name)
我来自 my_module 哈哈
刘晓蕾
name='哈哈'
import my_module
print(name)         #哈哈
print(my_module.name)   #刘晓蕾
from  my_module import name
name='哈哈'
print(name)

from my_module import read1,read2

from my_module import * 把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。

 在my_module.py中新增一行

__all__=['money','read1'] #这样在另外一个文件中用from my_module import *就这能导
入列表中规定的两个名字

 

 3.把模块当脚本执行

# 当一个py文件(只有一个py文件)
# 当做一个脚本的时候,能够提供一个独立功能
# 当做一个模块的时候,能够被调用这个函数功能

我们可以通过模块的全局变量__name__来查看模块名:
当做脚本运行:
__name__ 等于'__main__'

当做模块导入:
__name__= 模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':

4.搜索模块路径

import sys

print(sys.path)#执行文件的路径,如果定义在路径下,那都认识

 

 

2.包

2.1从包中导入模块(执行__init__)

示例一在run中导入glance/api/policy(此时glance与run在同级目录下)

 

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

目录结构
glance目录结构
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)

创建目录代码
创建目录代码
#文件内容

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

文件内容
glance 文件代码

 方法一:导入glance中的polic(直接导入)   from....import....(import导入的内容不可以带.)

import glance.api.policy
# from glance __init__
# 我来自glance api policy

 

2.设置__init__文件 

#glance __init__
from glance import api

#glance api __init__
from glance.api import policy
设置__init__文件

 导入语句:glance.api.policy.get()

3.可以添加api的地址到执行文件的sys.path中

path=r'C:\Users\ASUS\PycharmProjects\untitled3\模块与包的导入\glance\api'
import sys
sys.path.append(path)
import policy

#我来自glance api policy

 实例二在run中 导入glance中api的policy(此时glance在与run同级的目录下)

方法一

import 起名真的难.glance.api.policy as h
h.get()
# from glance __init__
# 我来自glance api policy(print打印)
# from policy.py

 

方法二:

import sys
sys.path.append(r'C:\Users\ASUS\PycharmProjects\untitled3\模块与包的导入\起名真的难\glance')
import api.policy as a
a.get()
# 我来自glance api policy
# from policy.py

 

 方法三:设置__init__文件

# 起名真的难__init__设置
import glance

glance __init__

#glance __init__文件设置
from 起名真的难.glance import api

#api  __init__文件设置
from 起名真的难.glance.api import policy
__init__文件设置

 

import 起名真的难
起名真的难.glance.api.policy.get()
不能直接 policy.get()
因为:from 后面的才是导入的包

{'起名真的难': <module '起名真的难' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\__init__.py'>, '起名真的难.glance': <module '起名真的难.glance' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\glance\\__init__.py'>, '起名真的难.glance.api': <module '起名真的难.glance.api' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\glance\\api\\__init__.py'>, '起名真的难.glance.api.policy': <module '起名真的难.glance.api.policy' from 'C:\\Users\\ASUS\\PycharmProjects\\untitled3\\模块与包的导入\\起名真的难\\glance\\api\\policy.py'>}

 

 




 
posted @ 2018-08-23 16:25  2275114213  阅读(154)  评论(0)    收藏  举报