一 为什么需要模块和包
随着项目越来越大,所有代码都放在一个文件中,已经不能满足我们的需求了。这时候就要将代码进行整理了,模块和包的出现就是为了解决这个问题的。模块可以将一些相关联的代码组合在一个py文件中,包可以将一些相关联的模块组合在一个文件夹中。
二 将一个模块导入到当前文件中的几种方式
1.import
导入某个模块。以后要使用模块中的函数或者方法或者变量,则需要使用模块名.xxx的形式调用。
2.from xxx import xxx
从某个模块中导入某个对象或者方法等。也可以一次性的从模块中导入所有的对象。使用from xxx import *。
from c import c_method
from d import my_add
# import c
print('hello world')
print('b end')
3.from a import b as c
从a中导入b并命名为c。以后在代码中引用b,通过c来引用。
三 包
包其实本质上就是一个文件夹,将一些相关联的模块组合在一起。但是如果一个文件夹要让Python识别为一个包,则必须在这个文件夹中创建一个叫做__init__.py的文件。一个文件夹中只有拥有了__init__.py这个文件,才能被视为一个包。
在同一个包中的模块如果要互相导入,则只能通过相对的方式进行导入,即:from . import xxx。
四 all
如果是在模块中写了这个变量,将控制from 模块名字 import *的行为。
如果在__init__.py文件中有这个变量,那么它将控制着from 包 import *的行为。
__all__ = ['GLOBAL_ZHILIAO','hello','Person']
GLOBAL_ZHILIAO = 'zhiliao'
def hello():
print('hello')
class Person(object):
def __init__(self):
print('person init method')
# 1. 模块__all__变量的作用
# from zhiliao import *
# print(GLOBAL_ZHILIAO)
# hello()
# p1 = Person()
# 2. 包中__all__变量的作用
# 从包中import *,将不能导入任何模块
from tools import *
my_file.save_data("")
my_request.get_request('www.baidu.com')
五 模块的搜索路径
在当前目录下搜索模块。
在环境变量PYTHONPATH中搜索模块。
在Python安装路径下的Lib目录下查找。
使用os.path可以看到所有的查找路径。
from tools import my_request
my_request.get_request('xxx')
import sys
print(sys.path)
六 模块的循环导入
比如有现在目录中有两个模块,一个a.py,一个b.py。在a.py中引用了b。而在b.py中又引用了a,那么这时候就产生了循环导入,让两个导入都不能完成。
七 name
如果是作为主程序来运行,那么等于__main__,如果是作为被导入的方式运行,那么是这个文件的名称。
八 安装包或者模块
可以通过pip或者easy_install安装。pip是现代化的一种安装包的方式,以下讲解pip的常用命令:
1.安装包
pip install requests
2. 安装指定版本的包
pip install django == 1.10.6
3.卸载包
pip uninstall django
4.升级包
pip install -U requests
5.升级pip
pip install -U pip
6.查看当前pip是哪个版本
pip --version
7.显示某个已安装的包的信息
pip show -f <包名>
8.列出当前环境下安装了哪些包
pip list
9. 将当前环境安装的包全部列出来放在文件中
pip freeze > requirements.txt
10.从某个文件中安装包
pip install -r requirements.txt
11.临时更改安装源,以豆瓣源为例
pip install <包名> -i https://pypi.douban.com/simple
12.永久更改安装源
windows操作系统:在当前用户目录下新建pip/pip.ini,然后在文件中添加以下代码:
[global]
index-url = https://pypi.douban.com/simple
Linux/Mac:在用户目录下新建.pip/pip.conf,然后在文件中添加以下代码:
[global]
index-url = https://pypi.douban.com/simple
九 import解析
1.sys.modules
#coding: utf-8
import sys
# import b
# 1. 执行b模块中的代码
# 2. 将b这个模块添加到sys.modules这个字典中
# import b
# sys.modules的作用:用来判断某个模块是否已经被导入到当前文件中
# is_in_modules = 'b' in sys.modules
# print(is_in_modules)
# import b
# 3. 在当前文件中,创建一个变量叫做b来指向b这个模块
# import b
# import os
from b import my_add
# 1. 执行b模块中所有的代码
# 2. 将b这个模块加到sys.modules中
print('b' in sys.modules)
# 3. 创建一个变量叫做my_add,指向了b模块下的my_add函数
2.import流程
# import b做的第一件事情,就是判断b是否在sys.modules这个字典中存在
# 1. 如果存在,就不再去导入b了。也就是说,就不会再去执行b模块中的代码
# 了
# 2. 如果不存在,就会导入b。然后执行b这个模块中的代码
# import b
from d import my_add
print('c file')
def c_method():
print('c method')
my_add(1,2)
十 _ _ name _ _
from tools import my_file
print('main:'+__name__)
# 如果一个Python文件或者模块是作为被导入来运行的,
# 那么就不是作为主运行文件来执行的
# 如果直接通过python a.py 那么a.py就是作为主运行文件来执行的
def main():
print('hello')
if __name__ == '__main__':
main()
# 1. 如果在主运行文件中:__name__是等于__main__
# 2. 如果在模块中:__name__是等于模块名。如果还处在某个包下面
# 等于`包名.模块名`
# 3. 如果在包的__init__文件中,那么等于包的名字