更好用的 Python 任务自动化工具:nox 官方教程
英文| nox tutorial
出处| nox 官方文档
译者| 豌豆花下猫@Python猫
Github地址:https://github.com/chinesehuazhou/nox_doc_cn
声明:本翻译基于CC BY-NC-SA 4.0授权协议,内容略有改动,转载请保留原文出处,请勿用于商业或非法用途。
本教程将引导你学会安装、配置和运行 Nox。
安装
Nox 可以通过pip轻松安装:
python3 -m pip install nox
你可能希望使用用户站点(user site)来避免对全局的 Python install 造成混乱:
python3 -m pip install --user nox
或者,你也可以更精致,使用pipx:
pipx install nox
无论用哪种方式,Nox 通常是要全局安装的,类似于 tox、pip和其它类似的工具。
如果你有兴趣在docker 内运行 nox,可以使用 DockerHub 上的thekevjames/nox镜像,它包含所有 nox 版本的构建与及所有支持的 Python 版本。
如果你想在GitHub Actions中运行 nox ,则可以使用Activatedleigh/setup-nox action,它将安装最新的 nox,并令 GitHub Actions 环境提供的所有 Python 版本可用。
编写配置文件
Nox 通过项目目录中一个名为 noxfile.py 的文件作配置 。这是一个 Python文件,定义了一组会话(sessions)。一个会话是一个环境和一组在这个环境中运行的命令。如果你熟悉 tox,会话就类似于它的环境。如果你熟悉 GNU Make,会话则类似于它的 target。
会话使用 @nox.session 装饰器作声明。这方式类似于 Flask 使用 @app.route。
下面是一个基本的 Nox 文件,对 example.py 运行flake8(你可以自己创建example.py):
import nox
@nox.session
def lint(session):
session.install("flake8")
session.run("flake8", "example.py")
第一次运行 Nox
现在,你已经安装了 Nox 并拥有一个配置文件, 那就可以运行 Nox 了!在终端中打开项目的目录,然后运行nox
。你应该会看到类似这样的内容:
$ nox
nox > Running session lint
nox > Creating virtualenv using python3.7 in .nox/lint
nox > pip install flake8
nox > flake8 example.py
nox > Session lint was successful.
✨现在你已第一次成功地使用 Nox 啦!✨
本教程的其余部分将带你学习其它可以用 Nox 完成的常见操作。如果需要的话,你还可以跳至命令行用法和配置&API文档。
安装依赖项
Nox 基本上是将 session.install 传递给 pip ,因此你可以用通常的方式来安装东西。这里有一些例子:
(1)一次安装一个或多个包:
@nox.session
def tests(session):
# same as pip install pytest protobuf>3.0.0
session.install("pytest", "protobuf>3.0.0")
...
(2)根据 requirements.txt 文件安装:
@nox.session
def tests(session):
# same as pip install -r -requirements.txt
session.install("-r", "requirements.txt")
...
(3)如果你的项目是一个 Python 包,而你想安装它:
@nox.session
def tests(session):
# same as pip install .
session.install(".")
...
运行命令
session.run 函数可让你在会话的虚拟环境的上下文中运行命令。以下是一些示例:
(1)你可以安装和运行 Python 工具:
@nox.session
def tests(session):
session.install("pytest")
session.run("pytest")
(2)如果你想给一个程序传递更多的参数,只需给 run 添加更多参数即可:
@nox.session
def tests(session):
session.install("pytest")
session.run("pytest", "-v", "tests")
(3)你还可以传递环境变量:
@nox.session
def tests(session):
session.install("black")
session.run(
"pytest",
env={
"FLASK_DEBUG": "1"
}
)
有关运行程序的更多选项和示例,请参见nox.sessions.Session.run()。
选择要运行的会话
一旦你的 Noxfile 中有多个会话,你会注意到 Nox 将默认运行所有的会话。尽管这很有用,但是通常一次只需要运行一两个。
你可以使用--sessions
参数(或-s
)来选择要运行的会话。你可以使用--list
参数显示哪些会话可用,哪些将会运行。这里有一些例子:
这是一个具有三个会话的 Noxfile:
import nox
@nox.session
def test(session):
...
@nox.session
def lint(session):
...
@nox.session
def docs(session):
...
如果你只运行nox --list
,则会看到所有会话都被选中:
Sessions defined in noxfile.py:
* test
* lint
* docs
sessions marked with * are selected,
sessions marked with - are skipped.
如果你运行nox --list --sessions lint
,Nox 将只运行 lint 会话:
nox > Running session lint
nox > Creating virtualenv using python3 in .nox/lint
nox > ...
nox > Session lint was successful.
还有更多选择和运行会话的方法!你可以在命令行用法中阅读更多有关调用 Nox 的信息。
针对不同的多个 Python 进行测试
许多项目需要支持一个特定的 Python 版本或者多个 Python 版本。你可以通过给 @nox.session 指定 Python,来使 Nox 针对多个解释器运行会话。这里有一些例子:
(1)如果你希望会话仅针对 Python 的单个版本运行:
@nox.session(python="3.7")
def test(session):
...
(2)如果你希望会话在 Python 的多个版本上运行:
@nox.session(python=["2.7", "3.5", "3.7"])
def test(session):
...
你会注意到,运行nox --list
将显示此会话已扩展为三个不同的会话:
Sessions defined in noxfile.py:
* test-2.7
* test-3.5
* test-3.7
你可以使用nox --sessions test
运行所有 test 会话,也可以使用列表中显示的全名来运行单个 test 会话,例如,nox --sessions test-3.5
。有关选择会话的更多详细信息,请参见命令行用法文档。
你可以在会话的virtualenv配置里,阅读到更多关于配置会话所用的虚拟环境的信息。
与 conda 一起测试
一些项目,特别是在数据科学社区,需要在 conda 环境中测试其使用的情况。如果你希望会话在 conda 环境中运行:
@nox.session(venv_backend="conda")
def test(session):
...
使用 conda 安装软件包:
session.conda_install("pytest")
可以用 pip 安装软件包进 conda 环境中,但是最好的实践是仅使用--no-deps
选项安装。这样可以避免 pip 安装的包与 conda 安装的包不兼容,防止 pip 破坏 conda 环境。
session.install("contexter", "--no-deps")
session.install("-e", ".", "--no-deps")
参数化
就像 Nox 可以控制运行多个解释器一样,它也可以使用nox.parametrize()装饰器,来处理带有一系列不同参数的会话。
这是一个简短示例,使用参数化对两个不同版本的 Django 进行测试:
@nox.session
@nox.parametrize("django", ["1.9", "2.0"])
def test(session, django):
session.install(f"django=={django}")
session.run("pytest")
如果运行nox --list
,你将会看到 Nox 把一个会话扩展为了多个会话。每个会话将获得你想传递给它的一个参数值:
Sessions defined in noxfile.py:
* test(django='1.9')
* test(django='2.0')
nox.parametrize() 的接口和用法特意类似于pytest的parametrize。这是 Nox 的一项极其强大的功能。你可以在参数化会话上,阅读更多有关参数化的信息与示例。
(译注:关于 pytest 和其它主流测试框架是如何使用参数化功能的?请参阅《Python 中如何实现参数化测试?》)
下一步
看看你!你现在基本上是一个 Nox 专家啦!✨
到了这一步,你还可以:
玩得开心!
更好用的 Python 任务自动化工具:nox 官方教程的更多相关文章
- Python 任务自动化工具:nox 的配置与 API
英文 | Configuration & API 出处 | nox 官方文档 译者 | 豌豆花下猫@Python猫 Github地址:https://github.com/chinesehua ...
- Python消息队列工具 Python-rq 中文教程
原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...
- Python 任务自动化工具 tox 教程
在我刚翻译完的 Python 打包系列文章中,作者提到了一个神奇的测试工具 tox,而且他本人就是 tox 的维护者之一.趁着话题的相关性,本文将对它做简单的介绍,说不定大家在开发项目时能够用得上. ...
- 强大的 Python 任务自动化工具!invoke 十分钟入门指南
接着前面的<tox 教程>,以及刚翻译好的<nox文档>,我们继续聊聊 Python 任务自动化的话题. nox 的作者在去年的 Pycon US 上,做了一场题为<Br ...
- Python 进程管理工具 Supervisor 使用教程
Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2 ...
- 前端自动化工具:Grunt使用教程
1.下载node.js,然后将node.exe文件所在的目录加入path环境变量 2.安装npm管理工具 2.1.下载npm源码,解压到npm文件夹里,不要把npm放在和node.exe相同的文件夹 ...
- Python包管理工具小结
此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为一名接触Python有一段时间的初学者,越来越体会到Python的方便之处,它使人能更 多的关注业务本身 ...
- 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...
- 阿里最强 Python 自动化工具开源了!
1. 前言 大家好,我是安果! 最近,阿里内部开源了一个 iOS 端由 Python 编写的自动化工具,即:tidevice 它是一款跨平台的自动化开源工具,不依赖 Xcode 就可以启动 WebDr ...
随机推荐
- UPC 2019年第二阶段我要变强个人训练赛第十六场
传送门: [1]:UPC比赛场 [2]:UPC补题场 F.gu集合(数论) •题目描述 题目描述: Dew有一个长为n的集合S. 有一天,他想选k个不同的元素出来做游戏. 但是Dew只有两只手,所以他 ...
- 2018-11-8-WPF-获取下载内容长度
title author date CreateTime categories WPF 获取下载内容长度 lindexi 2018-11-08 20:18:15 +0800 2018-11-08 20 ...
- 2018.11.16 浪在ACM 集训队第五次测试赛
2018.11.16 浪在ACM 集训队第五次测试赛 整理人:李继朋 Problem A : 参考博客:[1]朱远迪 Problem B : 参考博客: Problem C : 参考博客:[1]马鸿儒 ...
- classpath*与classpath
classpath*:的出现是为了从多个jar文件中加载相同的文件. classpath:只能加载找到的第一个文件.
- 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之树上倍增)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDU - 6333 Problem B. Harvest of Apples (莫队)
There are nn apples on a tree, numbered from 11 to nn. Count the number of ways to pick at most mm a ...
- error:cannot load file (code:5555h);bootauto.ini
最近发现有的网友在使用Ghost XP盘安装系统的时候,选择一键ghost到C盘出现下面的错误: error:cannot load file (code:5555h);bootauto.ini(或b ...
- Struts2 数据标签
Struts 2 的数据标签主要用于操作页面上显示的数据.下面列出的是重要的数据标签: action标签: 此标记使开发人员能够直接从JSP页面调用动作指定动作的名称和一个可选的命名空间.标签的主体内 ...
- npm脚本和package.json
1.什么是npm脚本 在创建node.js项目如一个vue项目,或一个react项目时,项目都会生成一个描述文件package.json . 比如npm允许在package.json文件里面,使用sc ...
- 018 Ceph的mon和osd的删除和添加
一.OSD管理 1.1 移出故障osd 查看当前节点的osd的id [root@ceph2 ceph]# df -hT Filesystem Type Size Used Avail Use% Mou ...