English|配置&API源码|Nox官方文档翻译器|本翻译基于CCBY-NC-SA4.0许可协议,内容略有改动。转载请保留原始出处,请勿用于商业或非法用途。接上一篇文章《更好用的 Python 任务自动化工具:nox 官方教程》NoxfileNox默认在一个名为noxfile.py的文件中查找配置。运行nox时,可以使用--noxfile参数指定其他文件。定义session格式:session(func=None,python=None,py=None,reuse_venv=None,name=None,venv_backend=None),将修饰函数指定为session。Nox会话是通过用@nox.session修饰的标准Python函数配置的。例如:importnox@nox.sessiondeftests(session):session.run('pytest')会话描述您可以使用文档字符串向会话添加描述。列出会话时显示第一行。例如:importnox@nox.sessiondeftests(session):"""运行测试套件。"""session.run('pytest')nox--list命令将显示:$nox--listAvailablesessions:*tests->运行测试套件。会话名称默认情况下,Nox使用装饰函数的名称作为会话名称。这对大多数项目都非常有效,但是,如果需要,您也可以使用@nox.session的名称参数来自定义会话的名称。例如:importnox@nox.session(name="custom-name")defa_very_long_function_name(session):print("Hello!")nox--list命令将显示:$nox--listAvailablesessions:*custom-name你可以告诉nox使用自定义名称运行会话:$nox--session"custom-name"你好!为会话配置virtualenv默认情况下,Nox将使用Nox在为每个会话和解释器创建新的virtualenv时使用的相同会话。如果您使用Python3.6安装了nox,默认情况下nox将在所有会话中使用Python3.6。您可以通过将python参数(或其别名py)指定给@nox.session来告诉nox使用不同的Python解释器/版本:@nox.session(python='2.7')deftests(session):pass你也可以告诉Nox使用多个Python解释器运行您的会话。Nox将为每个指定的解释器创建一个单独的virtualenv和运行会话。例如,以下会话将运行两次-一次使用Python2.7,一次使用Python3.6:@nox.session(python=['2.7','3.6'])deftests(session):passwhenyouprovideaversionNox会自动添加python来确定可执行文件的名称。但是,Nox也可以接受完整的可执行文件名称。如果你想使用pypy进行测试,eg:@nox.session(python=['2.7','3.6','pypy-6.0'])deftests(session):pass在准备你的session时,Nox会为每个解释器创建一个单独的会话。您可以在运行nox--list时看到这些会话。例如这个Noxfile:@nox.session(python=['2.7','3.5','3.6','3.7'])deftests(session):pass将生成这些会话:*tests-2.7*tests-3.5*tests-3.6*tests-3.7请注意,此扩展发生在参数化之前,因此您仍然可以对具有多个解释器的会话进行参数化。如果你想完全禁止创建virtualenv,你可以将python参数设置为False:@nox.session(python=False)deftests(session):pass最后,你也可以指定每次重用virtualenv而不是重新创建它:@nox.session(python=['2.7','3.6'],reuse_venv=True)deftests(session):pass将参数传递到会话中将参数传递到测试会话中通常很有用。这是一个如何使用参数来测试特定文件的简单示例:@nox.sessiondeftest(session):session.install('pytest')ifsession.posargs:test_files=session.posargselse:test_files=['test_a.py','test_b.py']session.run('pytest',*test_files)现在,如果你运行:nox那么nox将运行:pytesttest_a.pytest_b.py但如果你运行:nox--test_c。py然后nox将运行:pytesttest_c.pyParameterizedsession会话参数可以用nox.parametrize()装饰器参数化。以下是Django版本的典型参数化安装示例:@nox.session@nox.parametrize('django',['1.9','2.0'])deftests(session,django):session.install(f'django=={django}')session.run('pytest')当你运行nox时,它会创建两个不同的会话:$noxnox>Runningsessiontests(django='1.9')nox>pipinstalldjango==1.9。..nox>Runningsessiontests(djano='2.0')nox>pipinstalldjango==2.0nox.parametrize()的接口和用法刻意类似于pytest的参数化。格式:parametrize(arg_names,arg_values_list,ids=None)用于参数化会话。将arg_values_list列表分配给相应的arg_names,添加对修饰会话函数的新调用。参数化在会话发现期间执行,并且每次调用都显示为对nox的单个会话。参数:arg_names(Sequence[str])–参数名称序列arg_values_list(Sequence[Union[Any,Tuple]])–参数值列表,决定了使用不同参数值调用会话的频率。如果只指定一个参数名称,那么这只是一个值列表,例如[1,2,3]。如果指定了N个参数名称,则这必须是一个N元组列表,其中每个元素为其各自的参数名称指定一个值,例如[(1,'a'),(2,'b')]。ids(Sequence[str])–可选,测试id序列,由参数化参数使用。您还可以堆叠装饰器以生成组合参数的会话,例如:@nox.session@nox.parametrize('django',['1.9','2.0'])@nox.parametrize('database',['postgres','mysql'])deftests(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')如果您只想运行参数化会话,请参阅“指定参数化会话”部分。为参数化会话提供友好的名称为参数化会话自动生成的名称,例如tests(django='1.9',database='postgres'),即使使用关键字过滤也可能很长且笨拙。在这种情况下,可以为参数化会话提供辅助自定义ID。这两个例子是等价的:@nox.session@nox.parametrize('django',['1.9','2.0'],ids=['old','new'])deftests(session,django):。..@nox.session@nox.parametrize('django',[nox.param('1.9',id='old'),nox.param('2.0',id='new'),])def测试(session,django):...当运行nox--list时,你会看到他们的新ids:*tests(old)*tests(new)你可以使用nox--sessions"tests(old)",等等.这也适用于堆叠参数化。id在组合过程中组合。例如:@nox.session@nox.parametrize('django',['1.9','2.0'],ids=["old","new"])@nox.parametrize('database',['postgres','mysql'],ids=["psql","mysql"])deftests(session,django,database):...这些会话是在运行nox--list:*tests(psql,old)时生成的*tests(mysql,old)*tests(psql,new)*tests(mysql,new)Session对象Nox将使用Session类的一个实例来调用您的会话函数。classSession(runner)?会话对象被传递给每个用户定义的会话函数。这是在Nox会话中安装包和运行命令的主要方式。bin?—virtualenv的bin目录cd(dir)?—chdir()的别名chdir(dir)?—更改当前工作目录conda_install(args,*kwargs)?调用condainstall在会话中安装安装包裹。直接安装包:session.conda_install('pandas')session.conda_install('numpy','scipy')session.conda_install('--channel=conda-forge','dask==2.1.0')根据requirements.txt文件来安装包:session.conda_install('--file','requirements.txt')session.conda_install('--file','requirements-dev.txt')不会破坏conda安装的依赖项安装package:session.install('.','--no-deps')#Installineditablemode.session.install('-e','.','--no-deps')其余关键字参数是与run()相同。env?--环境变量字典,传递给所有命令。error(args,*kwargs)?——立即中止会话并可选择记录错误。install(args,*kwargs)?–调用pip在会话的virtualenv中安装包。直接安装包:session.install('pytest')session.install('requests','mock')session.install('requests[security]==2.9.1')根据requirements.txt安装包file:session.install('-r','requirements.txt')session.install('-r','requirements-dev.txt')安装当前包:session.install('.')#安装在可编辑模式.session.install('-e','.')具有与run()相同的剩余关键字参数。interactive?--如果Nox在交互式会话中运行,则返回True,否则返回False。log(args,*kwargs)?——在会话期间输出日志。notify(target)?——将给定的会话放在队列的末尾。这个方法是幂等的;对同一会话的多个通知无效。参数:target(Union[str,Callable])-要通知的会话。这可以通过指定适当的字符串(与nox-s使用的相同)或使用函数对象来完成。posargs?–用于设置从命令行上传到nox的额外参数。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-kfasttests/')您可以使用env为命令设置环境变量:session.run('bash','-c','echo$SOME_ENV',env={'SOME_ENV':'Hello'})您还可以使用success_codes,它告诉nox将非零退出代码视为成功。例如,如果您想将pytest的“发现测试,但未选择测试”错误视为成功:session.run('pytest','-k','notslow',success_codes=[0,5])在Windows上,del等内置命令不能直接调用,但可以使用cmd/c调用:session.run('cmd','/c','del','docs/modules.rst')参数:env(dictorNone)–暴露给命令的环境变量字典。默认情况下,传递所有环境变量。silent(bool)–静音命令输出,除非命令失败。默认为假。success_codes(list,tuple,orNone)–一组被认为成功的返回码。默认情况下,只有0被认为是成功的。external(bool)–如果为False(默认),那么不在virtualenv路径中的程序将被警告。如果为True,则不会发出警告。这些警告可以使用--error-on-external-run转换为错误。这对没有virtualenv的会话没有影响。skip(args,*kwargs)?——立即跳过会话并可选择记录警告。virtualenv?--运行所有命令的virtualenv。在Noxfile中修改Nox行为Nox具有各种可用于修改其行为的命令行参数。其中一些也可以使用nox.options在Noxfile中指定。例如,如果您想将Nox的virtualenvs存储在不同的目录中,而不是每次都将其传递给nox:importnoxnox.options.envdir=".cache"@nox.sessiondeftests(session):..提供一组默认运行的会话:importnoxnox.options.sessions=["lint","tests-3.6"]...可以在Noxfile中指定以下选项:nox.options.envdirequivalentSpecifying--envdir.nox.options.sessions等效于指定-s或--sessions.nox.options.keywords等效于指定-k或--keywords.nox.options.reuse_existing_virtualenvs等效于指定--reuse-existing-virtualenvs.您可以通过在调用它时指定--no-reuse-existing-virtualenvs来强制取消它。nox.options.stop_on_first_error等同于指定--stop-on-first-error。您可以通过在调用它时指定--no-stop-on-first-error来强制取消它。nox.options.error_on_missing_interpreters等同于指定--error-on-missing-interpreters。您可以通过在调用它时指定--no-error-on-missing-interpreters来强制抑制它。nox.options.error_on_external_run等同于指定--error-on-external-run。您可以通过在调用它时指定--no-error-on-external-run来强制禁用它。nox.options.report等同于指定–report。调用nox时,命令行上指定的任何选项都优先于Noxfile中指定的选项。如果在命令行中指定了--sessions或--keywords,那么在Noxfile中指定的两个选项都将被忽略。公众号【Python猫】,本号连载系列精品文章,包括喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等,欢迎收看注意。
