程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Configuration and API details of Python task automation tool NOx

編輯:Python

Preface :

NoxfileNox Default in a name called noxfile.py Find the configuration in the file . Running nox when , You can use --noxfile Parameter to specify other files .

Define the session Format :session(func=None, python=None, py=None, reuse_venv=None, name=None, venv_backend=None), Specify the decorated function as a session .

Nox Conversation is through being @nox.session The standard of decoration Python Function to configure .

for example :

import [email protected] tests(session): session.run('pytest')

Conversation description You can use the document string to add a description to the session . The first line will show... When the session is listed .

for example :

import [email protected] tests(session): """Run the test suite.""" session.run('pytest')

nox --list The command will show :

$ nox --listAvailable sessions:* tests -> Run the test suite.

Session name By default ,Nox Use the name of the decorated function as the name of the session . This is very effective for most projects , however , if necessary , You can also use @nox.session Of name The parameter comes from defining the name of the session .

for example :

import [email protected](name="custom-name")def a_very_long_function_name(session): print("Hello!")

nox --list The command will show :

$ nox --listAvailable sessions:* custom-name

You can tell nox Run the session with a custom name :

$ nox --session "custom-name"Hello!

Configure the virtualenv By default ,Nox Create a new... For each session virtualenv when , Will use Nox The same interpreter used . If you use Python 3.6 Installed nox, be nox Will be used by default in all sessions Python 3.6.

By giving @nox.session Appoint python Parameters ( Or its alias py), You can tell nox Use different Python Interpreter / edition :

@nox.session(python='2.7')def tests(session): pass

You can also tell Nox The use of multiple Python The interpreter runs your session .Nox A separate... Will be created for each interpreter specified virtualenv And run the session . for example , The following session will run twice —— One time use Python 2.7, One time use Python 3.6:

@nox.session(python=['2.7', '3.6'])def tests(session): pass

When you provide a version number ,Nox It will automatically add python To determine the name of the executable . however ,Nox You can also accept the full executable name . If you want to use pypy To test , for example :

@nox.session(python=['2.7', '3.6', 'pypy-6.0'])def tests(session): pass

When preparing your conversation ,Nox A separate session will be created for each interpreter . You can run nox --list When I see these conversations . For example, this Noxfile:

@nox.session(python=['2.7', '3.5', '3.6', '3.7'])def tests(session): pass

Will generate these conversations :

* tests-2.7* tests-3.5* tests-3.6* tests-3.7

Be careful , This extension occurs before parameterization , So you can still parameterize sessions of multiple interpreters .

If you want to completely disable creation virtualenv, You can set python Parameter is False:

@nox.session(python=False)def tests(session): pass

Last , You can also specify reuse every time virtualenv, Instead of recreating :

@nox.session( python=['2.7', '3.6'], reuse_venv=True)def tests(session): pass

Pass the parameters into the session It's often useful to pass parameters into a test session . Here is a simple example , Demonstrates how to use parameters to test specific files :

@nox.sessiondef 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)

Now if you run :

nox that nox Will run :

pytest test_a.py test_b.py But if you run :

nox -- test_c.py that nox Will run :

pytest test_c.py

Parameterized session The parameters of the session can be nox.parametrize() Decorator for parameterization .

Here is a typical parametric installation Django Example of version :

@[email protected]('django', ['1.9', '2.0'])def tests(session, django): session.install(f'django=={django}') session.run('pytest')

When you run nox when , It creates two different sessions :

$ noxnox > 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() The interface and usage of pytest Parameterization of Similar .

Format :parametrize(arg_names, arg_values_list, ids=None)

The function is to parameterize a session .

take arg_values_list The list is assigned to the corresponding arg_names, Add a new call to the decorated session function . Parameterization is performed during session discovery , Every call serves as nox A single session of .

Parameters :

arg_names (Sequence[str])—— A list of parameter names

arg_values_list (Sequence[Union[Any, Tuple]])—— The parameter value list determines how often a session is called with different parameter values . If only one parameter name is specified , So this is a simple list of values , for example [1,2,3]. If you specify N Parameter names , This has to be a N A list of tuples , Where each element specifies a value for its own parameter name , for example [(1,'a'), (2,'b')].

ids (Sequence[str]) —— optional , A series of tests id, The parameterized parameters are used .

You can also stack decorators , Make it generate a session that combines parameters , for example :

@[email protected]('django', ['1.9', '2.0'])@nox.parametrize('database', ['postgres', 'mysql'])def tests(session, django, database): ...

If you run nox —list, You will see that it generates the following session set :

* tests(database='postgres', django='1.9')* tests(database='mysql', django='1.9')* tests(database='postgres', django='2.0')* tests(database='mysql', django='2.0')

If you just want to run a parameterized session , see also " Specify the parameterized session " part .

Friendly names for parameterized sessions The name of the automatically generated parameterized session , Such as tests(django='1.9', database='postgres'), Use keywords to filter , It can also be long and difficult to deal with .

In this scenario , It can provide auxiliary customization for parameterized sessions id .

These two examples are equivalent :

@[email protected]('django', ['1.9', '2.0'], ids=['old', 'new'])def tests(session, django): [email protected]@nox.parametrize('django', [ nox.param('1.9', id='old'), nox.param('2.0', id='new'),])def tests(session, django): ...

When running nox --list when , You will see their new id:

* tests(old)* tests(new)

You can use it. nox --sessions "tests(old)", And so on .

This also applies to stack parameterization .id It was combined during the combination .

for example :

@[email protected]( 'django', ['1.9', '2.0'], ids=["old", "new"])@nox.parametrize( 'database', ['postgres', 'mysql'], ids=["psql", "mysql"])def tests(session, django, database): ...

function nox --list It will generate these conversations :

* tests(psql, old)* tests(mysql, old)* tests(psql, new)* tests(mysql, new)

Conversation object Nox Will use Session Class to call your session function .

class Session(runner) :

The session object is passed to each user-defined session function .

This is Nox The main way to install packages and run commands in a session .

bin:——virtualenv Of bin Catalog

cd(dir):——chdir() An alias for

chdir(dir):—— Change the current working directory

conda_install(args,

*kwargs):

call conda install To install packages in a session environment .

Install the package directly :

session.conda_install('pandas')session.conda_install('numpy', 'scipy')session.conda_install('--channel=conda-forge', 'dask==2.1.0')

according to requirements.txt File to install the package :

session.conda_install('--file', 'requirements.txt')session.conda_install('--file', 'requirements-dev.txt')

Don't destroy conda Installed dependencies install packages :

session.install('.', '--no-deps')# Install in editable mode.session.install('-e', '.', '--no-deps')

The rest of the keyword parameters follow run() identical .

env:—— A dictionary of environment variables , To all orders .

error(args,

*kwargs):—— Abort the session immediately and log an error at will .

install(args,

*kwargs): —— call pip In conversation virtualenv Inner installation package .

Direct installation package :

session.install('pytest')session.install('requests', 'mock')session.install('requests[security]==2.9.1')

according to requirements.txt File to install the package :

session.install('-r', 'requirements.txt')session.install('-r', 'requirements-dev.txt')

Install the current package :

session.install('.')# Install in editable mode.session.install('-e', '.')

The rest of the keyword parameters follow run() identical .

interactive:—— If Nox Run... In an interactive session , Then return to True, Otherwise return to False.

log(args,

*kwargs):—— Output a log during the session .

notify(target): —— Put the given session at the end of the queue .

This method is idempotent ; Multiple notifications of the same session are invalid .
Parameters :target (Union[str, Callable])—— Sessions that need notification . This specifies the appropriate string ( And nox -s Use the same ) Or use function objects .

posargs:—— Used to set upload from the command line to nox Extra parameters for .

python:—— Pass to @nox.session Of Python edition .

run(args, env=None, kwargs): —— Run a command .

Command must install string list specified , for example :

session.run('pytest', '-k', 'fast', 'tests/')session.run('flake8', '--import-order-style=google')

You can't pass everything as a string . for example , You can't do that :
session.run('pytest -k fast tests/')

You can use it. env Set environment variables for commands :

session.run( 'bash', '-c', 'echo $SOME_ENV', env={'SOME_ENV': 'Hello'})

You can still use it success_codes , tell nox Treat non-zero exit code as success . for example , If you want to pytest Of “tests discovered, but none selected” Mistakes are regarded as success :

session.run( 'pytest', '-k', 'not slow', success_codes=[0, 5])

stay Windows On , image del Such built-in commands cannot be called directly , But you can use cmd /c To call them :

session.run('cmd', '/c', 'del', 'docs/modules.rst')

Parameters :

env (dict or None)—— Environment variable dictionary for exposing to commands . By default , Pass all environment variables .

silent (bool) —— Silent command output , Unless the order fails . The default is False.

success_codes (list, tuple, or None)—— A series of return codes considered successful . By default , Only 0 Considered a success .

external (bool) —— If False( The default value is ), So don't virtualenv The program in the path will give an alarm . If True, No alarm will be given . These alarms can be used --error-on-external-run Turn it into an error . This pair doesn't have virtualenv The conversation has no effect on .

skip(args,

*kwargs):—— Jump out of the conversation immediately , And randomly record an alarm .

virtualenv:—— Run all commands virtualenv.

modify Noxfile Medium Nox Behavior Nox There are various command line parameters , Can be used to modify its behavior . Some of them can also be found in Noxfile Use in nox.options Appoint . for example , If you want to Nox Of virtualenvs Store in a different directory , You don't need to pass it on to nox:

import noxnox.options.envdir = ".cache"@nox.sessiondef tests(session): ...

perhaps , If you want to provide a set of sessions that run by default :

import noxnox.options.sessions = ["lint", "tests-3.6"]...

The following options can be found in Noxfile It is specified in :

nox.options.envdir Equivalent to designating –envdir.

nox.options.sessions Equivalent to designating -s or –sessions.

nox.options.keywords Equivalent to designating -k or –keywords.

nox.options.reuse_existing_virtualenvs Equivalent to designating –reuse-existing-virtualenvs . By specifying --no-reuse-existing-virtualenvs , You can force it off .

nox.options.stop_on_first_error Equivalent to designating –stop-on-first-error. By specifying --no-stop-on-first-error, You can force it off .

nox.options.error_on_missing_interpreters Equivalent to designating –error-on-missing-interpreters . By specifying --no-error-on-missing-interpreters , You can force it off .

nox.options.error_on_external_run Equivalent to designating –error-on-external-run. By specifying --no-error-on-external-run , You can force it off .

nox.options.report Equivalent to designating –report.

Calling nox when , Any option specified on the command line takes precedence over Noxfile The options specified in . If you specify... On the command line --sessions or --keywords, So in Noxfile Both options specified in will be ignored .

This is about Python  Task automation tools nox  Configuration and  API That's all for the detailed article , More about Python  nox And  API Please search the previous articles of software development network or continue to browse the relevant articles below. I hope you will support software development network more in the future !



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved