python 模块和包的导入

时间:2022-01-26 22:14:54

http://www.cnblogs.com/linhaifeng/articles/6379069.html

1,模块

开源模块

https://pypi.python.org/pypi

pip/ easy_install

安装

python setup.py build

python setup.py install

pip install xxxx

  

添加环境变量

 import os,sys
print (os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(base_dir)

 

import 模块过程

import 此时做了三件事
1.为源文件(spam模块)创建新的名称空间,
	在spam中定义的函数和方法 若是使用到了global时访问的
	就是这个名称空间(spam 的名称空间)
	
	2. 在新创建的命名空间中执行模块中包含的代码
	
	3. 创建名字spam来引用该命名空间 ,spam 就相当于变量

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

  

 

 

4. 导入模块的方式

import module

from module.xx.xx import xx

from module.xx.xx import xx as rename

from module.xx.xx import *   # 不推荐使用

 

# from xxx import xxx
# 会和本文件里面的变量冲突,
# 如果本文件里面和模块里面都有,优先找本文件里面的变量,再去模块里面的
# 当前位置直接使用read1和read2就好了,执行时,仍然以spam.py文件全局名称空间
# 导入的方法在执行时,始终是以源文件为准的
# 如果当前有重名read1或者read2,那么会有覆盖效果
from spam import read1 as read

# 多行导入
from spam import (read1,
read2,
money)

 

 


"""
[guazhang@dhcp-12-129 aa]$ tree
.
├── bb
│   ├── cc
│   │   └── dd.py
│   └── ee.py
├── ff.py
└── test_module.py

总结
首先要先把aa 添加到环境变量里面。
aa已经添加到环境变量里面了,那么在aa 里面的文件或文件夹都可以直接导入,
如果是文件夹,那么就用 from ... import ... 方式, import 后面可以是文件也可以是文件里面的功能
如果import 后面是文件,调用里面的功能就要带上文件名,比如
f1 是函数名,dd 是包含f1的文件 , bb 是aa下面的文件夹

from bb.cc.dd import f1
f1()

from bb.cc import dd
dd.f1()

from ff import f1 # ff 是aa 下面的文件,包含f1 功能
f1()

当用的是python3 解释器的时候,文件夹里面没有__init__.py 也不会报错,会自动帮你补上
pyton2 就需要__init__.py 。

"""
import os,sys
print(os.path.dirname(__file__))
sys.path.append(os.path.dirname(__file__))
# /home/guazhang/PycharmProjects/python19/day4/模块/aa 添加到环境变量


def f1():
	print("from local")

from bb.ee import f1
f1()

from ff import f1
f1()

from bb.cc.dd import f1
f1()

from bb.cc import dd
dd.f1()



# from aa.ff import f1
# f1()


"""
/home/guazhang/PycharmProjects/python19/day4/模块/aa
from cc
from bb
spam模块:
spam模块:

"""

  

 

模块和脚本的关系

"""
http://www.cnblogs.com/linhaifeng/articles/6384466.html
http://www.cnblogs.com/linhaifeng/articles/6379069.html
如果s模块中的名字前加_,即 _money,则from spam import *,则_money不能被导入
我们自定义的模块名不应该与系统内置模块重名

把模块当做脚本执行 
我们可以通过模块的全局变量__name__来查看模块名:

当做脚本运行:
__name__ 等于'__main__'

当做模块导入:
__name__=

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':    # 当成脚本的形式去执行




"""

  

 

模块搜索路径
"""
模块搜索路进
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看

搜索路径:
当一个命名为spam的模块被导入时
    解释器首先会从内建模块中寻找该名字
    找不到,则去sys.path中找该名字

sys.path从以下位置初始化
    1 执行文件所在的当前目录
    2 PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
    3 依赖安装时默认指定的

  

"""
# 包 ,是一个里面有__init__.py 的文件夹

环境变量是以执行文件为准,不能操作包里面的目录结构

#具体的:包就是一个包含有__init__.py文件的文件夹,
所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来


#需要强调的是:
1. 在python3中,即使包下没有__init__.py文件,
import 包仍然不会报错,而在python2中
包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,
包只是模块的一种形式而已,包的本质就是一种模块


#1.关于包相关的导入语句也分为import和from ... import ...两种,
但是无论哪种,无论在什么位置,
在导入时都必须遵循一个原则:凡是在导入时带点的,
点的左边都必须是一个包,否则非法。
可以带有一连串的点,如item.subitem.subsubitem,
但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,
点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

#2、import导入文件时,产生名称空间中的名字来源于文件,
import 包,产生的名称空间的名字同样来源于文件,
即包下的__init__.py,导入包本质就是在导入该文件

#3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

"""

  

 

 

 

5.time 模块

 

python 模块和包的导入

 

python 模块和包的导入

 

 6 random 模块

  python 模块和包的导入

7. OS 模块

 

python 模块和包的导入

 

 python 模块和包的导入

python 模块和包的导入

 

 

 

 8. sys 模块

 

python 模块和包的导入

 

### 打印进度条

  import sys,time
  for i in range(10):
  sys.stdout.write("#")
  sys.stdout.flush()
  time.sleep(0.3) # 度条

 

sys.stdin.readline()[:-1] :打印输入的内容并删除最好一个动作

 

9. pickle/json . 

  pickle 支持的可序列的类型更多

  json :支持多种语言,ruby,java

# 序列化, 字符串到内存中

import pickle
f = open("user_acc.txt","wb")
#f.write(b"test")
#f.write("123") ## 字符串
info = {
"alex":"123",
"jon":"2222"
}
f.write(pickle.dumps(info))
f.close()

 

## 从内存里面反序列化, 从内存转为字符串
##字典,列表是内存里的,保存不了 。 字符串是才可以存在硬
import pickle
f = open("user_acc.txt","rb")
data_from_atm = pickle.loads(f.read())
print (data_from_atm)