picamera源码阅读.1(安装文件详解)
https://picamera.readthedocs.io/en/release-1.13/quickstart.html
我们研究一下这个东西在写什么
这个setup文件时要执行得软件
import os
import sys
from setuptools import setup, find_packages
导入了三个常用得库
if sys.version_info[0] == 2:
if not sys.version_info >= (2, 7):
raise ValueError('This package requires Python 2.7 or above')
elif sys.version_info[0] == 3:
if not sys.version_info >= (3, 2):
raise ValueError('This package requires Python 3.2 or above')
else:
raise ValueError('无法识别的主要Python版本')
做了一些版本得判断,raise说了多少次了,就是一个触发值错误
import os
import sys
print(sys.version_info)
print(sys.version_info[0])
写了一个验证得代码
import os...
sys.version_info(major=3, minor=8, micro=8, releaselevel='final', serial=0)
3
这个是输出,是我本机的输出
import os
HERE = os.path.abspath(os.path.dirname(__file__))
print(HERE)
返回绝对路径
import os
print(os.path.abspath(".")) #当前目录的绝对路径
print(os.path.abspath(r"..")) #上级目录的绝对路径
以上代码的输出命令
try:
import multiprocessing
except ImportError:
pass
这个是要动态的导入一个包,使用了除错
__project__ = 'picamera'
__version__ = '1.13'
__author__ = 'Dave Jones'
__author_email__ = 'dave@waveform.org.uk'
__url__ = 'http://picamera.readthedocs.io/'
__platforms__ = 'ALL'
setup函数包含的参数解释
--name 包名称------------生成的egg名称
--version (-V) 包版本----生成egg包的版本号
--author 程序的作者------包的制作者名字
--author_email 程序的作者的邮箱地址
--maintainer 维护者
--maintainer_email 维护者的邮箱地址
--url 程序的官网地址
--license 程序的授权信息
--description 程序的简单描述-------程序的概要介绍
--long_description 程序的详细描述---程序的详细描述
--platforms 程序适用的软件平台列表
--classifiers 程序的所属分类列表
--keywords 程序的关键字列表
--packages 需要处理的包目录(包含__init__.py的文件夹)-------和setup.py同一目录下搜索各个含有 init.py的包
--py_modules 需要打包的python文件列表
--download_url 程序的下载地址
--cmdclass
--data_files 打包时需要打包的数据文件,如图片,配置文件等
--scripts 安装时需要执行的脚步列表
--package_dir 告诉setuptools哪些目录下的文件被映射到哪个源码包。一个例子:package_dir = {'': 'lib'},表示“root package”中的模块都在lib 目录中。
--requires 定义依赖哪些模块
--provides定义可以为哪些模块提供依赖
--find_packages() 对于简单工程来说,手动增加packages参数很容易,刚刚我们用到了这个函数,它默认在和setup.py同一目录下搜索各个含有 init.py的包。
其实我们可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。另外,也可以排除一些特定的包
find_packages(exclude=[".tests", ".tests.", "tests.", "tests"])
--install_requires = ["requests"] 需要安装的依赖包
--entry_points 动态发现服务和插件
__classifiers__ = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: BSD License",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
'Topic :: Multimedia :: Graphics :: Capture :: Digital Camera',
]
--classifiers 程序的所属分类列表
__keywords__ = [
'raspberrypi',
'camera',
]
关键字列表
__extra_requires__ = {
'doc': ['sphinx'],
'test': ['coverage', 'pytest', 'mock', 'Pillow', 'numpy'],
'array': ['numpy'],
}
额外使用到的包,对不认识的包简单的查询一下
如果衡量单元测试对相应代码的测试重量,覆盖率是一个必要非充分条件,因此统计代码的覆盖率,检视单测是否充分,就尤为的重要。
coverage是一种用于统计Python代码覆盖率的工具,通过它可以检测测试代码对被测代码的覆盖率如何。
可以高亮显示代码中哪些语句未被执行,哪些执行了,方便单测。
并且,coverage支持分支覆盖率统计,可以生成HTML/XML报告。
https://coverage.readthedocs.io/en/latest/
破案了
https://docs.pytest.org/en/6.2.x/
pytest
mock简介
mock原是python的第三方库
python3以后mock模块已经整合到了unittest测试框架中,不用再单独安装
Mock这个词在英语中有模拟的意思,因此我们可以猜测出这个库的主要功能是模拟一些东西
准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为
既然mock已经被整合到了unittest单元测试框架中,可想而知mock的目的就是为了让我们更好的进行测试
mock作用
1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模块,那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以
使用mock模拟被依赖接口,完成目标接口的测试
2. 单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试
3. 模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复杂的接口业务,那么我们完全可以使用mock来模拟这个复杂的业务接口,其实
这个和解决接口依赖是一样的原理
4.前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同的页面,那么你就需要调用后台的接口,但是后台接口还未开发完成,是不是你就停止这部分工作呢?答案是否定的,你完全可以借助mock来模拟后台这个接口返回你想要的数据
https://python-pillow.org/
https://pillow.readthedocs.io/en/stable/
picamera里面用到了这个库
我们以后有机会把这个也读了
https://www.askpython.com/python-modules/python-io-module#:~:text=The%20io.open%20%28%29%20function%20is%20a%20much%20preferred,cannot%20be%20used%20like%20the%20io%20handle%20object.
执行与文件相关的 I/O 操作时,此模块非常有用(例如文件读取/写写)
看我们最后这段程序,写了一个main函数
导入了io库
这个就是导入的rst文件
一起使用setup工具注册到python库里面了,使用了with的工具,不要考虑别的
值得一提的是,这个代码
从一个str里面将协议找到,先把str拆分成lsit,然后遍历从classfiers,找到License开头的就是,值得一学~
rsplit() 方法从右侧开始将字符串拆分为列表。
如果未指定 "max",则此方法将返回与 split() 方法相同的结果。
注释:若指定 max,列表将包含指定数量加一的元素。
从这个里面找
.. _BSD license: https://opensource.org/licenses/BSD-3-Clause
Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。