picamera源码阅读.1(安装文件详解)

https://picamera.readthedocs.io/en/release-1.13/quickstart.html

我们研究一下这个东西在写什么

这个setup文件时要执行得软件

import osimport sysfrom 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 osimport 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 osHERE = os.path.abspath(os.path.dirname(__file__))print(HERE)

返回绝对路径

import os
print(os.path.abspath(".")) #当前目录的绝对路径
print(os.path.abspath(r"..")) #上级目录的绝对路径

以上代码的输出命令

try: import multiprocessingexcept 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 指定值,则在指定范围内检查。

(0)

相关推荐