python 模块
Python模块
模块是一个包含一系列数据、函数、类等组合的程序组,可以供给其他模块或文件使用
模块的分类:
- 内建模块(builtins) 在解析器内可以直接使用
- 标准库模块, 安装python时已安装且可以直接使用
- 第三方模块(通常开源) 需要自己安装
- 用户自己编写的模块(可以作为其他人的第三方库)
pip
moudle_name: 是对应的模块名;请自行更换为自己需要更新的模块名
安装对应的模块: pip install moudle_name
查看所有模块 pip list
更新所有的模块 pip-review --local --interactive
更新某一个模块 pip install --upgrade module_name
指定镜像源更新模块 pip install moudle_name -i https://pypi.douban.com/simple
pip国内的一些镜像
- 阿里云 http://mirrors.aliyun.com/pypi/simple/
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
- 豆瓣(douban) http://pypi.douban.com/simple/
- 清华镜像 https://pypi.tuna.tsinghua.edu.cn/simple/
- 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
永久更改镜像
linux:
修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple
windows:
直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,在pip 目录下新建文件pip.ini,内容如下
或者按照网友的建议:win+R 打开用户目录%HOMEPATH%,在此目录下创建 pip 文件夹,在 pip 目录下创建 pip.ini 文件, 内容如下
[global] timeout = 6000 index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn
清除缓存
查看缓存信息 pip cache info
还有指令可以查看 cache 列表和路径
pip cache list
pip cache dir
使用下面指令可以清除缓存 pip cache purge
对于 ubuntu,可以直接删除缓存所在文件夹
sudo rm -rf ~/.cache/pip
对于 win,可以直接删除缓存所在文件夹
C:\Users\your_name\AppData\Local\pip\cache
调用模块
引用模块: import module1
调用模块:模块名.函数名
语法:
import 模块名 [as 模块新名]
from...import... 语句
from...import * 语句 把一个模块里的所有内容导入到当前命名空间,直接调用函数就行,不用模块.函数,一般不建议使用
内建模块————数学模块 math
cmath.sqrt(number)——返回平方根,可用于负数
abs(number)——返回指定值的绝对值
math.e——自然对数的底e
math.pi——圆周率pi
内建标准库模块——时间模块 time
计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1(UTC时间),比中国时间晚8个小时
注:CST为中国标准时间(China Standard Time UTC +8:00)
time.time() 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
time.sleep(miao) 让程序按给定secs秒数的浮点数睡眠一段时间
time.asctime([tuple]) 将9个元素时间元组转换为(美国时间格式) Wed Jul 18 13:21:58 2018不给参数返回当地当前时间(美国时间格式)
time.mktime(tuple) 将本地9个元素日期时间元组转换为UTC时间(秒)
time.gmtime(miao) 用给定秒数转换为UTC表达的9元素时间元组 (缺省返回当前时间元组)(不写参数时,返回当前时间元组)time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=13, tm_min=9, tm_sec=41, tm_wday=2, tm_yday=199, tm_isdst=0)
time.localtime(miao) 返回9个元素的时间元组,缺省时默认返回本地的当前时间 将UTC秒数时间转换为日期元组(以本地时间为准)
模块包——paockage
包就是文件夹,是包的文件夹必须存在__init__.py文件,通常放包的文档字符串,该文件的内容可以为空__int__用于标识当前文件夹是一个包,__init__会在包加载时自动调用,有利于防止命名冲突,可以在需要时加载一个或部分模块而不是全部模块
举个栗子:
test.py package_runoob |-- __init__.py |-- runoob1.py |-- runoob2.py
package_runoob/runoob1.py
1 def runoob1(): 2 print "我是模块1"
package _runoob/runoob2.py
1 def runoob1(): 2 print "我是模块2"
在 package_runoob 目录下创建 __init__.py,有这个文件证明package_runoob是一个模块包
4 if __name__ == '__main__': 5 print '作为主程序运行' 6 else: 7 print 'package_runoob 初始化'
然后我们在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包
4 # 导入 Phone 包 5 from package_runoob.runoob1 import runoob1 6 from package_runoob.runoob2 import runoob2 7 8 runoob1() 9 runoob2()
以上实例输出结果:
package_runoob 初始化 I'm in runoob1 I'm in runoob2
包的导入
import xx
import 包名 [as 包新名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
from xx import xx
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 模块名 import 函数名
from xx import *
from 模块名 import *
from 包名 import *
from 包名.模块名 import *
python 导入包时搜索路径的顺序:
- 搜索程序的当前路径
- sys.path 提供的路径
__init__.py内的__all__列表
作用:用来记录此包中有哪些子包或者模块在用from import* 语句时被导用
说明:__all__列表只对 from xxx import *语句起作用
包的相对导入是指包内模块的相互导入
语法:
from 相对路径包或模块 import 属性或模块名
from 相对路径包或模块 import *
相对路径:
.代表当前目录
.. 代表上一级目录
... 代表上二级目录
.... 以此类推
注:相对导入时不能超出包的外部
python一般默认是绝对路径导包的
搜索路径
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
- 1、当前目录
- 2、如果不在当前目录,sys.path提供的路径,sys.path是一个列表,里面放着都是模块的搜索路径,
- 3、如果都找不到,Python会察看默认路径,也就是内建模块。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在sys模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
python的环境变量(就是路径) set PYTHONPATH=c:\python27\lib;
模块的加载过程
1、在模块导入时,模块的所有语句都会执行一边
2、如果模块已经导入那么在此导入不会重新执行模块内的语句
模块导入和执行的过程
1、先搜索相关的路径,找到模块名.py
2、判断是否由此模块对应的.pyc文件。如果.pyc文件比.py文件新,则直接加载.pyc文件
3、否则用模块.py文件,生成.pyc文件,并加载执行
pyc python的编译
编译 解释执行
mymod.py --------> mymod.pyc --------> python3
模块的预置属性
模块的__doc__属性绑定此模块的文档字符串 print(__doc__) #我是文档字符串
模块的__file__属性记录模块对应的文件路径名 print(__file__) #D:/Users/Never/PycharmProjects/Tedu/day13/练习.py
模块的__name__属性 用来记录模块自身名字 print(__name__) #'__main__'
用处:1、记录函数名
2、用来判断是否为主模块
说明:1、当此模块为主模块(也就是第一个运行的模块时)运行时,__name__绑定的是__main__
2、当此模块不是主模块时,而是被其他模块导入时,此时__name__绑定模块名
模块的属性调用时,就不需要使用模块名.属性
模块的__all__列表
模块中的__all__列表是一个用来存放可导出属性的字符串列表
作用:当用from 模块名 import * 语句导入模块时,只导入__all__列表里面的属性(注意是模块名不是包名)
bk.py文件
# __all__属性只对 from import * 语句有效 __all__ = ['hello1', 'name1'] def hello1(): print("1") def hello2(): print("2") def hello3(): print("3") name1 = 'aaaaaa' name2 = 'aaaaaa'
wo.py文件
from bk import* hello1() print(name1)
模块的隐藏属性 模块中以‘_’开头的属性,在from 模块名 import *或者from...import...导入时,将不被导入,通常称这些属性为隐藏属性
reload()函数
当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。
因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:
import imp
imp.reload(module_name)
在这里,module_name要直接放模块的名字,而不是一个字符串形式,也不是字符串名。
help(obj)函数可以查看模块的相关文档字符串
dir( )函数:返回的是一个列表,容纳了括号中模块包含的所有变量、函数和模块
1 import math 2 content = dir(math) 3 print(content) 4 ''' 5 ['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 6 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 7 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 8 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 9 'sqrt', 'tan', 'tanh'] 10 ''' 11 12 dic()
在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的路径。
globals()和locals()函数
根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。
多模块项目设计时,不要用global定义全局变量,可以用函数传参传入全局变量,全局变量写在main模块里面,然后main()调动主模块
如果实在没办法,可通过stdu.name = 2类似的方法把模块stud的name值调过来
创建pip包
将自己的项目上传到PyPI(Python Package Index),可以让其他人方便地安装和使用你的Python包。下面是详细的步骤:
1. 准备项目文件
确保你的项目目录包含以下文件:
setup.py
:项目的配置文件。README.md
:项目的介绍文件(可选,但推荐)。LICENSE
:许可证文件(可选,但推荐)。- 其他项目源代码文件和资源。
2. 编写 setup.py
setup.py
是Python包的配置文件,内容通常如下:
from setuptools import setup, find_packages setup( name="your_package_name", version="0.1.0", description="A short description of your package", long_description=open('README.md').read(), long_description_content_type='text/markdown', author="Your Name", author_email="your_email@example.com", url="https://github.com/yourusername/your-repo", packages=find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], python_requires='>=3.6', )
3. 安装必要工具
安装 setuptools
、wheel
和 twine
这三个工具:
pip install setuptools wheel twine
4. 构建项目分发档案
在项目根目录下运行以下命令,生成分发档案:
python setup.py sdist bdist_wheel
这会在 dist
目录下生成 .tar.gz
和 .whl
文件。
5. 注册PyPI账号
如果你还没有PyPI账号,请访问 PyPI官网 注册一个账号。
目前PyPi强制要求双因素认证(2FA),这一变化虽然提高了安全性,但也给日常工作带来了麻烦。
第一步:配置恢复代码
请妥善保存这些代码,它们是你在遇到问题时重置 2FA 的关键!
第二步:添加 2FA
安装 Python 包 pyotp 来生成 2FA 验证码。复制应用代码,并编写 Python 脚本获取验证码。
import pyotp key = '粘贴 2FA 代码' totp = pyotp.TOTP(key) print(totp.now())
6. 上传到PyPI
使用 twine
将生成的分发档案上传到PyPI:
twine upload dist/*
此时会提示你输入PyPI的用户名和密码或者API。上传成功后,你的包就会在PyPI上可用了。
7. 测试上传到 TestPyPI(可选)
在正式上传到PyPI之前,可以先上传到 TestPyPI 进行测试:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
你需要在 TestPyPI 上注册一个账号,注册地址:TestPyPI。
需要输入API Token,我们把API Token复制到剪切板,然后点击输入密码的地方右键就行,不用Ctrl+C
8. 安装或升级你的包
上传成功后,可以用 pip
安装并测试你的包:
pip install [--upgrade] -i https://test.pypi.org/simple/ your_package_name
通过这些步骤,你应该能够成功地将自己的Python包上传到PyPI。