关于python:更好用的-Python-任务自动化工具nox-官方教程

7次阅读

共计 3795 个字符,预计需要花费 10 分钟才能阅读完成。

本教程将疏导你学会装置、配置和运行 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 的一项极其弱小的性能。你能够在参数化会话上,浏览更多无关参数化的信息与示例。

以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈,发送“J”即可收费获取,每日干货分享

正文完
 0