赞
踩
typora-root-url: ./
我的听课笔记,课程链接:https://www.bilibili.com/video/BV194411r7a8
封装一些工具代码,供其他模块调用。模块开发思想!
有效的对程序进行分解,方便代码的管理和维护
防止同一模块命名重复问题
name = "asd"
name = "qwe"
print(name)
#模块1 name_module.py
name = "asd"
#模块2
name = "qwe"
print(name_module.name) #asd
标准的包和模块:
安装好python后系统自动安装的模块,只有手动调入和自动调入之分!!!
安装好python后,自动帮我们安装好的一些模块,可以直接导入使用。比如在lib目录下的包和模块os
import os
每个安装了python的用户的电脑上都有这些模块。在自己的电脑上写的某个系统模块的代码,到其他人的电脑上同样可以运行。
特殊的包和模块:内建的包和模块,就是当在我们编码过程中,python自动帮我们导入的模块,不用自己手动调用!比如print()
。
import builtins #bulitsin就是内建模块
print(dir(builtins))#看一下内建模块里面的资源
builtins.print("xxx")
三方的包和模块:
自定义的包和模块:
创建模块:直接创建一个xxx.py文件即可,在其他文件这样调用import xxx
.
创建包:创建一个文件夹,在python2中务必创建一个__init.py__
文件,python3.3版本往后可以不用创建,但是为了代码的兼容性,建议还是创建。
创建一个包p1,p1中有一个Tool模块,怎么导入呢?import p1.Tool
。怎么调用其中的变量呢?p1.Tool.num
。
__init__.py
文件的作用:第一次调用包的时候,会自动执行这个文件的代码!
基本信息包括:名称、内容、位置。
模块的名称和包的名称不加后缀。
参看标准模块的位置:
import os
#没有__file__属性的python库无法使用此方法查询
print(os.__file__)#会打印出包的位置,我的位置C:\Users\HP\AppData\Local\Programs\Python\Python36-32\Lib
python2和python3不兼容,就是因为他们的标准包是不一样的(比如参数的个数)!
包的内容怎么查看?
dir(包名)
函数。常规导入
import M
。
同时导入多个模块,就要通过逗号分隔:import M1,M2
。
如果是某个包里面的模块,就要通过点语法来定位:import 包名.模块
。
导入模块时,给模块起个别名:import M as 别名
,import numpy as np,pandas as pd
,这样使用的时候就不需要写一长串路径了。有一个应用场景:
if file_ectension == "txt":#如果扩展名是:.txt
import text_parse
txt_parse.open()
txt_parse.read()
txt_parse.close()
elif file_extension == “doc”:#如果扩展名是:.doc
import doc_parse
doc_parse.open()
doc.parse.read()
doc.parse.close()
#-------------------减少冗余
if file_ectension == “txt”:#如果扩展名是:.txt
import text_parse as p
elif file_extension == “doc”:#如果扩展名是:.doc
import doc_parse as p
p.open()
p.read()
p.close()
5. 使用的时候要加名称前缀:`M1.num`,使用资源通过点语法定位`包名.模块名.资源`。
```python
# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])
使用资源时候,就要通过点语法来指明:包名.模块名
,这里当作对象来处理资源!路径一定要写完整!
p1.my_moudle.run()#当作属性来处理
注意:如果导入一个包,那么不会导入任何模块,所以是错误的。有以下两种解决方法:
from...import...
的形式导入。from语句的导入,语法:from A import B as C
。
从多层级的包里面导入模块要注意不要把包拆开,保证import后面的路径最简
from p1.sub_p import sub_xxx
from p1 import sub_p.sub_xxx #这是错误的
2. 注意在使用资源的时候不要加点语法
```python
from other import num as n1, num2, num3
print(other.num)#错误
print(num)#对的,不要加路径
from other.tool import num
print(num)
注意事项:保证import后面的路径最简!
from 大包 import 小包.模块 #错误
from 包 import 模块.子资源 #错误
from 模块 import *
from 包 import *
他们表示批量的导入资源!这种方式要慎用,因为很可能造成变量名的重复!没有__all__=[...]
时,会导入模块中的所有非下划线资源!
从模块中批量的导入信息:被导入的模块中如果有__all__["a","b","c"]
(必须是一个元素为字符串的列表),这样通过下面的方式导入资源的时候,可以自动导入__all__
里面的资源
from 包 import *
from 包 import *
从包中批量的导入信息:假设现在有包p1,包里面有tool1模块、tool2模块,还有一个init文件,里边有__all__=["tool1(模块1)","tool2(模块2)"]
。可通过下面的语法来导入模块和调用资源:
from 包 import *
#--------
访问时不需要加包名!!!
print(tool1.num)
print(tool2.num)
第一次导入时:
在自己当下的命名空间里执行所有代码。
#模块1 other.py
num = 1
def run():
print(num)
#主文件 test.py
num = 2
import other
other.run()
#这时输出1,不是2!!!因为是在被导入的模块的命名空间里执行所有代码!不会与主文件里面的代码产生矛盾!
创建一个模块对象并为其分配内存地址,并将模块所有的顶级变量以属性的形式绑在模块对象上,这个对象的类型是模块,模块的名称就是文件名!
在import位置引入import后面的变量名称到当前命名空间(通过import指向一个模块对象other模块对象!)。
第二次导入时(在同一个主文件前后导入两次):直接执行上面的第3步。
注意1:函数也是一个命名空间,所以在函数中导入一个包,也只能在函数内部使用。
注意2:
from other import num1
也会执行所有代码,产生一个模块对象,而不是执行其中一部分!与import的区别只是拿那些东西来用![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJN94Tij-1606269400788)(/tupian_包和模块/导入路径.png)]
内置模块的优先级>路径列表(sys.path)。
sys.path里边:
import sys
print(sys.path)#打印路径列表
当前目录
环境变量PYTHONPATH种指定的路径列表(不一定会有)
特定路径下的.pth文件中的路径列表
在python安装路径的lib库中搜索
怎么在sys.path里边追加路径:
import sys
sys.path.append(r"路径,到具体的文件")#r表示原始字符串
注意,这个方式是单次有效的,只有有命令sys.path.append(r"路径,到具体的文件")#r表示原始字符串
的源文件才有效,而其他的文件无效!!!
怎么改环境变量呢?
新建一个名为PYTHONPATH的环境变量!注意:pycharm对PYTHONPATH的路径支持不是很好,所以修改后任不可用!可以手动添加!
添加.path文件,这是一个配置文件!
在那里创建呢?
import site
print(site.getsitepackages())#输出目录,在这些目录里边添加!
在此目录添加一个文本文件,后缀改为:.pth
,然后就可在里边加上路径名称(到文件上一层目录),多个路径回车分隔!
第一次导入模块时,从上面的路径去找模块,第二次导入时,从已经加载的模块去找,然后直接用,不会再找了!怎么查看已经加载的模块呢?
import sys
print(sys.modules)
某个局部范围导入,这样就可以不用在主文件中都执行一遍模块文件,从而节省了运行时间:
def run():
import other
print(other.num1)
print(other.num2)
#在函数的命名空间才可以用!在函数外边是用不了other里面的东西的!
覆盖导入:
场景1:自定义模块和非内置的标准模块重名,根据前者的存储位置,有可能前者会覆盖后者!自定义模块不要与后者重名!标准模块在lib里面!自定义的模块会覆盖标准模块!!!
import sys
print(sys.path)#打印出sys.path,也就是包的检索路径!如果加入的
场景2:自定义模块和内置模块重名,内置模块肯定会覆盖自定义!如果特别想用自定义模块,使用from包名import...
来指定特定的模块!
from 包和模块 import sys #这样就可以使用自定义sys了
循环导入:
有两个模块,在A里边导入了B,同时在B里面导入了A。这样就造成了循环导入!循环导入就是下边这个流程:
#-------模块一other
import test
o1 = "o1"
o2 = "o2"
print(test.t1)
print(test.t2)
#-------模块二test
import other
t1 = "t1"
t2 = "t2"
print(other.o1)
print(other.o2)
第二种情形:
#-------模块一other
import test
o1 = "o1"
o2 = "o2"
print(test.t1)
print(test.t2)
#-------模块二test
import other
t1 = "t1"
t2 = "t2"
print(other.o1)
print(other.o2)
概念:两个功能相近的包,根据需求优先选择其中一个导入!
应用场景:有两个包A、B,他们功能相近,想优先使用A,而且要做到在没有A的情况下,使用B备用!
try:
import other2 as o
except ModuleNotFoundError:
import other as o
print(o.o1)
包内导入:在包里面A模块用B模块的资源!分为两类:绝对导入和相对导入
绝对导入:参照sys.path进心检索,比如指明包和模块名称的情况import a
和from a import b
,python3是这样python2不同!
相对导入:使用.
来代指相对路径
.
根据模块名称所获取的当前目录。..
根据模块名称所获取的上层目录。例如:from.import a
、from ..import a
当我们尝试去使用解释器去执行一个py文件的时候,解释器就会确定当前文件所在目录,然后,把这个目录添加到sys.path中,添加过之后,再往后,基本上sys.path就已经确定。
包和模块这个目录下没有tool2,所以会报错!!!
可以通过下面这个办法解决问题:from p1 import Tool2
,应因为p1在包和模块这个路径里面,但是如果p1这个包被改成了p2,那么,所有的导入命令都要改!!相对路径的办法就可以解决这个问题!!!
如果py文件直接以脚本的形式执行,那么他的名称就是__main__
,如果使用模块的形式进行加载的,那么他的名称是由加载的路径决定的!比如包名.子包名.模块
。包名就是顶级包(top-level package)!
并不是..
就是上面两层目录,也不是.
就是当前目录!这里的..
和.
表示的是从模块名称找,而不是在模块的目录找!
在python2中,import tool2
相当于python3中的from . import tool2
,也就是说,python2中是隐式的相对导入!!!
结论:以后在编写代码的时候,包内导入使用相对导入,保外导入使用绝对导入!
三方模块和标准模块的区别:
一般大多数人有需求的功能才会做成标准模块!
什么是安装模块?就是把别人的代码搞到本地,让我们来使用。
安装方式:
总结:目前,官方支持且认可度较高的包管理器有两个:distutils和setuptools:
源码:
.egg格式:是setuptools引入的一种格式,setuptools可以识别它,安装它。
.whl格式:本质就是.zip格式,是为了替代.egg。
python官方提供的包托管的网站:pipy.python.org。
安装方式
直接拷贝到文件夹,任意一个sys.path的路径之中,一般存放在Lib/site-package文件夹中。
步骤如下:
python setup.py install
;python3:执行python3 setup.py install
;注意:
python3 setup.py install
。easy_install_ xxx.egg(包名)
。怎样安装呢?
easy_install_ xxx.whl(包名)
。如果依赖其他包,则需要联网。pip install 路径xxx.whl(包名)
.只需再命令行操作,不需要切换目录!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abpYpY5H-1606269400790)(C:\Users\HP\Desktop\python包和模块笔记\tupian_包和模块\pip远程安装.png)]
如果一个电脑同时有python2和python3,当使用easy_install_ xxx(包名)
远程安装的时候,请问是安装到python2还是python3中呢?是安装在python3中的,因为在环境变量里边,python3的路径在python2的前面!怎么指定安装在那个版本的python里面呢?easy_install-N.N
,N.N用于指明安装到那个版本的python中,例如:
easy_install-2.7 requests
easy_install-3.6 requests
注意:最新安装的包就是活动版本(导入包时导入的版本)!是最新安装的包,而不是最新版本!
怎么升级呢?使用这个命令:easy_install --upgrade requests
,或者:easy_install -U requests
。
如果忘了怎么怎么查看帮助呢?easy_install -h
。
当我们安装某个库的时候,会做两件事:
怎么卸载呢?有两个方案:
方案一(手动卸载):
方案二(命令卸载):
使用命令easy_install -m 包名
,这个命令只会在.pth文件文件里面删除记录,而不会删除包文件!在下节将说明这只是一个巧合!
easy_install.pth
中把对应的记录删除,这样如果不直接指明包的版本就无法导入包了。import pkg_resources
pkg_resources.require("requests==2.18.3(必须是完整的版本)")
import requests
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqG8d6zW-1606269400792)(C:\Users\HP\Desktop\python包和模块笔记\tupian_包和模块\切换安装源.png)]
注意:压缩包的后缀名为.egg,要删除.zip!
pip的学习文档:http://pip.pypa.io/en/stable。
切换安装源:
单次修改:
pip install --index-url http://pypi.douban.com/simple/requests
,指定检索,也就是只到一个地址检索指定包。
pip install --extra-index-url http://pypi.douban.com/simple/requests
,扩展检索,当没有在官方pipy里面检索到的时候,才会到扩展地址检索。
永久性的修改:
在C盘中找到目录: C:\Users\用户名
查看在Roaming文件夹下新建pip文件夹(如果已经存在就跳过此步)
在pip文件夹中创建一个pip.ini文件
使用记事本的方式打开pip.ini文件,写入:
[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host=pypi.douban.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6nBhlOI-1606269400795)(C:\Users\HP\Desktop\python包和模块笔记\tupian_包和模块\pip安装在不同版本中.png)]
查看所有包:命令行中输入pip list
。
查看所有没有被依赖的包:命令行中输入pip list --not-required
。
查看所有过期的包(不是最新版本):命令行中输入pip list --outdated
。
查看某个库的具体信息:命令行中输入pip show 包名
。
当忘了某个包的全名,可以通过检索来查看包的全名,命令为:pip search 包名关键字
。这时是在默认的官网地址检索,是比较慢的。现在要在指定的地址检索,用这个命令:pip search -i https://pypi.tuna.tsinghua.edu.cn/simple 包名关键字
。
pip install "request == 2.18"
pip install "request >= 2.0"
pip install "request > 2.0,<3.0"
通过这个命令进行更新:pip install --upgrade requests
。会将三方包一起升级。
通过这个命令卸载:pip uninstall 包名
。注意:
easy_install
安装的,会自动删除easy_install.pth文件中对应的路径,会自动删除对应的.egg文件。pip install
安装的,会直接删除对应的包文件。pip安装的包不会有路径文件!!!将所有安装包记录生成一个文本文件:pip freeze
。与pip list
相比,这个命令会将大家都有的包(比如pip)过滤掉!
步骤如下:
cd 路径
。pip freeze > ./xxxx.txt
。当别人拿到这个文本文件,步骤如下:
pip install -r requirement.txt
。版本由三部分组成:n1.n2.n3(如pandas 1.0.5)。
n3:当版本bug修复之后,n3+1。
n2:增加了一个小功能,n2+1。
n1:修改了之前的功能,或者添加了一个新功能(修改了之前的api),n1+1。api理解为某个函数增加了参数。修改了n1,要注意是否要升级。
删除easy_install.pth文件中对应的路径,会自动删除对应的.egg文件。
2. 如果是通过pip install
安装的,会直接删除对应的包文件。pip安装的包不会有路径文件!!!
将所有安装包记录生成一个文本文件:pip freeze
。与pip list
相比,这个命令会将大家都有的包(比如pip)过滤掉!
步骤如下:
cd 路径
。pip freeze > ./xxxx.txt
。当别人拿到这个文本文件,步骤如下:
pip install -r requirement.txt
。版本由三部分组成:n1.n2.n3(如pandas 1.0.5)。
n3:当版本bug修复之后,n3+1。
n2:增加了一个小功能,n2+1。
n1:修改了之前的功能,或者添加了一个新功能(修改了之前的api),n1+1。api理解为某个函数增加了参数。修改了n1,要注意是否要升级。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。