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

2021-05-18 14:19:44 浏览数 (1)

代码语言:javascript复制
https://picamera.readthedocs.io/en/release-1.13/quickstart.html

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

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

代码语言:javascript复制
import os
import sys
from setuptools import setup, find_packages

导入了三个常用得库

代码语言:javascript复制
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说了多少次了,就是一个触发值错误

代码语言:javascript复制
import os
import sys

print(sys.version_info)
print(sys.version_info[0])

写了一个验证得代码

代码语言:javascript复制

import os...
sys.version_info(major=3, minor=8, micro=8, releaselevel='final', serial=0)
3

这个是输出,是我本机的输出

代码语言:javascript复制
import os
HERE = os.path.abspath(os.path.dirname(__file__))
print(HERE)

返回绝对路径

代码语言:javascript复制
import os

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

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

以上代码的输出命令

代码语言:javascript复制
try:
    import multiprocessing
except ImportError:
    pass

这个是要动态的导入一个包,使用了除错

代码语言:javascript复制
__project__ = 'picamera'
__version__ = '1.13'
__author__ = 'Dave Jones'
__author_email__ = 'dave@waveform.org.uk'
__url__ = 'http://picamera.readthedocs.io/'
__platforms__ = 'ALL'
代码语言:javascript复制
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 动态发现服务和插件
代码语言:javascript复制
__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 程序的所属分类列表

代码语言:javascript复制
__keywords__ = [
    'raspberrypi',
    'camera',
]

关键字列表

代码语言:javascript复制

__extra_requires__ = {
    'doc':   ['sphinx'],
    'test':  ['coverage', 'pytest', 'mock', 'Pillow', 'numpy'],
    'array': ['numpy'],
}

额外使用到的包,对不认识的包简单的查询一下


如果衡量单元测试对相应代码的测试重量,覆盖率是一个必要非充分条件,因此统计代码的覆盖率,检视单测是否充分,就尤为的重要。

coverage是一种用于统计Python代码覆盖率的工具,通过它可以检测测试代码对被测代码的覆盖率如何。

可以高亮显示代码中哪些语句未被执行,哪些执行了,方便单测。

并且,coverage支持分支覆盖率统计,可以生成HTML/XML报告。

代码语言:javascript复制
https://coverage.readthedocs.io/en/latest/

破案了

代码语言:javascript复制
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来模拟后台这个接口返回你想要的数据

代码语言:javascript复制
https://python-pillow.org/
代码语言:javascript复制
https://pillow.readthedocs.io/en/stable/

picamera里面用到了这个库

我们以后有机会把这个也读了

代码语言:javascript复制
https://www.askpython.com/python-modules/python-io-module#:~:text=The io.open () function is a much preferred,cannot be used like the io handle object.

执行与文件相关的 I/O 操作时,此模块非常有用(例如文件读取/写写)

看我们最后这段程序,写了一个main函数

导入了io库

这个就是导入的rst文件


一起使用setup工具注册到python库里面了,使用了with的工具,不要考虑别的

值得一提的是,这个代码

从一个str里面将协议找到,先把str拆分成lsit,然后遍历从classfiers,找到License开头的就是,值得一学~


rsplit() 方法从右侧开始将字符串拆分为列表。

如果未指定 "max",则此方法将返回与 split() 方法相同的结果。

注释:若指定 max,列表将包含指定数量加一的元素。

从这个里面找

代码语言:javascript复制
.. _BSD license: https://opensource.org/licenses/BSD-3-Clause

Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。

0 人点赞