Python?任務(wù)自動化工具nox?的配置與?API詳情
前言:
NoxfileNox 默認在一個名為noxfile.py的文件中查找配置。在運行 nox 時,你可以使用 --noxfile參數(shù)指定其它的文件。
定義會話格式:session(func=None, python=None, py=None, reuse_venv=None, name=None, venv_backend=None),將被裝飾的函數(shù)指定為一個會話。
Nox 會話是通過被@nox.session裝飾的標準 Python 函數(shù)來配置的。
例如:
import nox @nox.session def tests(session): session.run('pytest')
會話描述你可以使用文檔字符串向會話中添加一個描述。第一行內(nèi)容會在列出會話時顯示。
例如:
import nox @nox.session def tests(session): """Run the test suite.""" session.run('pytest')
nox --list命令將顯示出:
$ nox --list Available sessions: * tests -> Run the test suite.
會話名稱默認情況下,Nox 使用被裝飾函數(shù)的名稱作為會話的名稱。這對于絕大多數(shù)項目都非常有效,但是,如果需要,你也可以使用 @nox.session 的 name 參數(shù)來自定義會話的名稱。
例如:
import nox @nox.session(name="custom-name") def a_very_long_function_name(session): print("Hello!")
nox --list 命令將顯示:
$ nox --list Available sessions: * custom-name
你可以告訴 nox 使用自定義的名稱運行會話:
$ nox --session "custom-name" Hello!
配置會話的virtualenv默認情況下,Nox 在為每個會話創(chuàng)建一個新的 virtualenv 時,會使用 Nox 所用的同一個解釋器。如果你使用 Python 3.6 安裝了 nox,則 nox 將默認在所有會話中使用 Python 3.6。
通過給 @nox.session 指定 python 參數(shù)(或其別名 py),你可以告訴 nox 使用不同的 Python 解釋器/版本:
@nox.session(python='2.7') def tests(session): pass
你還可以告訴 Nox 使用多個 Python 解釋器運行你的會話。Nox 將為指定的每個解釋器創(chuàng)建一個單獨的 virtualenv 并運行會話。例如,下面的會話將運行兩次——一次使用 Python 2.7,一次使用 Python 3.6:
@nox.session(python=['2.7', '3.6']) def tests(session): pass
當你提供一個版本號時,Nox 會自動添加 python 來確定可執(zhí)行文件的名稱。但是,Nox 也可以接受完整的可執(zhí)行名稱。如果你想使用 pypy 來測試,例如:
@nox.session(python=['2.7', '3.6', 'pypy-6.0']) def tests(session): pass
當準備你的會話時,Nox 將為每個解釋器創(chuàng)建單獨的會話。你可以在運行 nox --list 的時候看到這些會話。例如這個 Noxfile:
@nox.session(python=['2.7', '3.5', '3.6', '3.7']) def tests(session): pass
將產(chǎn)生這些會話:
* tests-2.7 * tests-3.5 * tests-3.6 * tests-3.7
注意,這個擴展發(fā)生在參數(shù)化之前,所以你仍然可以對多個解釋器的會話進行參數(shù)化。
如果你想完全禁止創(chuàng)建 virtualenv,你可以設(shè)置 python 參數(shù)為 False:
@nox.session(python=False) def tests(session): pass
最后,你還可以指定每次都重用 virtualenv,而不是重新創(chuàng)建:
@nox.session( python=['2.7', '3.6'], reuse_venv=True) def tests(session): pass
將參數(shù)傳入會話通常往測試會話中傳遞參數(shù)是很有用的。下面是一個簡單示例,演示了如何使用參數(shù)對特定文件作測試:
@nox.session def test(session): session.install('pytest') if session.posargs: test_files = session.posargs else: test_files = ['test_a.py', 'test_b.py'] session.run('pytest', *test_files)
現(xiàn)在如果你運行:
nox
那么 nox 將運行:
pytest test_a.py test_b.py
但如果你運行:
nox -- test_c.py
那么 nox 將運行:
pytest test_c.py
參數(shù)化會話會話的參數(shù)可以用nox.parametrize() 裝飾器來作參數(shù)化。
下面是一個典型的參數(shù)化安裝 Django 版本的例子:
@nox.session @nox.parametrize('django', ['1.9', '2.0']) def tests(session, django): session.install(f'django=={django}') session.run('pytest')
當你運行nox時,它會創(chuàng)建兩個不同的會話:
$ nox nox > Running session tests(django='1.9') nox > pip install django==1.9 ... nox > Running session tests(djano='2.0') nox > pip install django==2.0
nox.parametrize() 的接口和用法故意跟pytest的參數(shù)化 相類似。
格式:parametrize(arg_names, arg_values_list, ids=None)
作用是參數(shù)化一個會話。
將 arg_values_list 列表賦給對應(yīng)的 arg_names,為裝飾的會話函數(shù)添加新的調(diào)用。參數(shù)化在會話發(fā)現(xiàn)期間執(zhí)行,每次調(diào)用都作為 nox 的單個會話出現(xiàn)。
參數(shù):
- arg_names (Sequence[str])——一系列參數(shù)名稱
- arg_values_list (Sequence[Union[Any, Tuple]])——參數(shù)值列表決定了使用不同參數(shù)值調(diào)用會話的頻率。如果只指定了一個參數(shù)名,那么這就是一個簡單的值列表,例如[1,2,3]。如果指定了 N 個參數(shù)名,這必須是一個 N 元組的列表,其中每個元素為其各自的參數(shù)名指定一個值,例如 [(1,'a'), (2,'b')]。
- ids (Sequence[str]) ——可選項,一系列測試 id,被參數(shù)化的參數(shù)使用。
你也可以堆疊裝飾器,令其產(chǎn)生組合了參數(shù)的會話,例如:
@nox.session @nox.parametrize('django', ['1.9', '2.0']) @nox.parametrize('database', ['postgres', 'mysql']) def tests(session, django, database): ...
如果運行nox —list,你將看到它生成了以下的會話集:
* tests(database='postgres', django='1.9') * tests(database='mysql', django='1.9') * tests(database='postgres', django='2.0') * tests(database='mysql', django='2.0')
如果你只想運行一個參數(shù)化會話,請參閱"指定參數(shù)化會話"部分。
為參數(shù)化的會話起友好的名稱自動生成的參數(shù)化會話的名稱,如tests(django='1.9', database='postgres'),即使用關(guān)鍵字過濾,也可能很長且很難處理。
在此場景中,可以為參數(shù)化會話提供輔助的自定義 id 。
這兩個例子是等價的:
@nox.session @nox.parametrize('django', ['1.9', '2.0'], ids=['old', 'new']) def tests(session, django): ... @nox.session @nox.parametrize('django', [ nox.param('1.9', id='old'), nox.param('2.0', id='new'), ]) def tests(session, django): ...
當運行nox --list時,你將看到它們的新 id:
* tests(old) * tests(new)
你可以用nox --sessions "tests(old)",以此類推。
這也適用于堆疊參數(shù)化。id 是在組合期間組合的。
例如:
@nox.session @nox.parametrize( 'django', ['1.9', '2.0'], ids=["old", "new"]) @nox.parametrize( 'database', ['postgres', 'mysql'], ids=["psql", "mysql"]) def tests(session, django, database): ...
運行nox --list時會產(chǎn)生這些會話:
* tests(psql, old) * tests(mysql, old) * tests(psql, new) * tests(mysql, new)
會話對象Nox 將使用 Session 類的一個實例來調(diào)用你的會話函數(shù)。
class Session(runner) :
會話對象被傳遞到用戶自定義的每個會話函數(shù)中。
這是在 Nox 會話中安裝軟件包和運行命令的主要途徑。
- bin:——virtualenv 的 bin 目錄
- cd(dir):——chdir() 的一個別名
- chdir(dir):——更改當前的工作目錄
- conda_install(
- args,
- *kwargs):
調(diào)用conda install來在會話環(huán)境中的安裝軟件包。
直接安裝軟件包:
session.conda_install('pandas') session.conda_install('numpy', 'scipy') session.conda_install('--channel=conda-forge', 'dask==2.1.0')
根據(jù) requirements.txt 文件來安裝軟件包:
session.conda_install('--file', 'requirements.txt') session.conda_install('--file', 'requirements-dev.txt')
不破壞 conda 已安裝的依賴而安裝軟件包:
session.install('.', '--no-deps') # Install in editable mode. session.install('-e', '.', '--no-deps')
剩下的關(guān)鍵字參數(shù)跟 run() 相同。
- env:——一個環(huán)境變量的字典,傳給所有的命令。
- error(
- args,
- *kwargs):——立即中止會話并隨意地記錄一個錯誤。
- install(
- args,
- *kwargs): ——調(diào)用 pip 在會話的 virtualenv 里安裝包。
直接安裝包:
session.install('pytest') session.install('requests', 'mock') session.install('requests[security]==2.9.1')
根據(jù) requirements.txt 文件來安裝軟件包:
session.install('-r', 'requirements.txt') session.install('-r', 'requirements-dev.txt')
安裝當前的包:
session.install('.') # Install in editable mode. session.install('-e', '.')
剩下的關(guān)鍵字參數(shù)跟 run() 相同。
- interactive:——如果 Nox 在交互式會話中運行,則返回 True,否則返回 False。
- log(
- args,
- *kwargs):——在會話期間輸出一份日志。
- notify(target): ——將給定的會話放在隊列的末尾。
此方法是冪等的;對同一會話的多次通知無效。
參數(shù):target (Union[str, Callable])——需要通知的會話。這可以指定適當?shù)淖址?與nox -s 的使用相同)或使用函數(shù)對象。
- posargs:——用于設(shè)置從命令行上傳給 nox 的額外參數(shù)。
- python:——傳給@nox.session的 Python 版本。
- run(args, env=None, kwargs): ——運行一個命令。
命令必須安裝字符串列表指定,例如:
session.run('pytest', '-k', 'fast', 'tests/') session.run('flake8', '--import-order-style=google')
你不能把所有東西都當作一個字符串傳遞。例如,不可以這樣:session.run('pytest -k fast tests/')
你可以用env 為命令設(shè)置環(huán)境變量:
session.run( 'bash', '-c', 'echo $SOME_ENV', env={'SOME_ENV': 'Hello'})
你還可以使用success_codes ,告訴 nox 將非零退出碼視為成功。例如,如果你想將 pytest 的“tests discovered, but none selected”錯誤視為成功:
session.run( 'pytest', '-k', 'not slow', success_codes=[0, 5])
在 Windows 上,像del這樣的內(nèi)置命令不能直接調(diào)用,但是你可以使用cmd /c 來調(diào)用它們:
session.run('cmd', '/c', 'del', 'docs/modules.rst')
參數(shù):
- env (dict or None)——用于向命令公開的環(huán)境變量字典。默認情況下,傳遞所有環(huán)境變量。
- silent (bool) ——靜默命令輸出,除非命令失敗。默認為 False。
- success_codes (list, tuple, or None)——一系列被認為是成功的返回碼。默認情況下,只有 0 被認為是成功的。
- external (bool) ——如果為 False(默認值),那么不在 virtualenv 路徑中的程序?qū)l(fā)出告警。如果為 True,則不會發(fā)出告警。這些告警可以使用--error-on-external-run將其轉(zhuǎn)換為錯誤。這對沒有 virtualenv 的會話沒有影響。
- skip(
- args,
- *kwargs):——立即跳出會話,并隨意記錄一個告警。
- virtualenv:——運行所有命令的 virtualenv。
修改 Noxfile 中的 Nox 行為Nox 有各種命令行參數(shù),可用于修改其行為。其中一些還可以在 Noxfile 中使用 nox.options 指定。例如,如果你想將 Nox 的 virtualenvs 存儲在不同的目錄中,而不需要每次都將它傳遞給 nox:
import nox nox.options.envdir = ".cache" @nox.session def tests(session): ...
或者,如果你想提供一組默認運行的會話:
import nox nox.options.sessions = ["lint", "tests-3.6"] ...
以下的選項可以在 Noxfile 中指定:
- nox.options.envdir 等同于指定 –envdir.
- nox.options.sessions 等同于指定 -s or –sessions.
- nox.options.keywords 等同于指定 -k or –keywords.
- nox.options.reuse_existing_virtualenvs 等同于指定 –reuse-existing-virtualenvs 。通過在調(diào)用時指定 --no-reuse-existing-virtualenvs ,你可以強制取消它。
- nox.options.stop_on_first_error 等同于指定 –stop-on-first-error. 通過在調(diào)用時指定 --no-stop-on-first-error,你可以強制取消它。
- nox.options.error_on_missing_interpreters 等同于指定 –error-on-missing-interpreters 。通過在調(diào)用時指定 --no-error-on-missing-interpreters ,你可以強制取消它。
- nox.options.error_on_external_run 等同于指定 –error-on-external-run. 通過在調(diào)用時指定 --no-error-on-external-run ,你可以強制取消它。
- nox.options.report 等同于指定 –report。
在調(diào)用 nox 時,命令行上指定的任何選項都優(yōu)先于 Noxfile 中指定的選項。如果在命令行上指定了--sessions或--keywords,那么在 Noxfile 中指定的兩個選項都將被忽略。
到此這篇關(guān)于Python 任務(wù)自動化工具nox 的配置與 API詳情的文章就介紹到這了,更多相關(guān)Python nox與 API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 操作mysql數(shù)據(jù)中fetchone()和fetchall()方式
這篇文章主要介紹了python 操作mysql數(shù)據(jù)中fetchone()和fetchall()方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python實現(xiàn)讀取txt文件中的數(shù)據(jù)并繪制出圖形操作示例
這篇文章主要介紹了Python實現(xiàn)讀取txt文件中的數(shù)據(jù)并繪制出圖形操作,涉及Python文件讀取、數(shù)值運算及基于pylab庫的圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2019-02-02python中pandas庫的iloc函數(shù)用法解析
在 Pandas 中,.iloc 是一種用于基于整數(shù)位置進行索引的屬性,可以用于獲取 DataFrame 或 Series 中的數(shù)據(jù),這篇文章主要介紹了python中pandas庫的iloc函數(shù)用法,需要的朋友可以參考下2023-05-05