<p>经过一些尝试和错误,与我在@Yann的回答中的评论相反,似乎<code>poetry</code>忽略了<code>nox</code>传递的<code>VIRTUAL_ENV</code>变量</p>
<p>受Claudio Jolowicz的精彩系列<a href="https://cjolowicz.github.io/posts/hypermodern-python-03-linting/" rel="nofollow noreferrer">Hypermodern Python</a>的启发,我用以下方法解决了这个问题:</p>
<pre class="lang-py prettyprint-override"><code>@nox.session(python=PYTHON)
def test(session: Session) -> None:
"""
Run unit tests.
Arguments:
session: The Session object.
"""
args = session.posargs or [" cov"]
session.install(".")
install_with_constraints(
session,
"coverage[toml]",
"pytest",
"pytest-cov",
"pytest-mock",
"pytest-flask",
)
session.run("pytest", *args)
</code></pre>
<p>在这里,我只是使用<code>pip</code>来安装一个PEP517包</p>
<p>不幸的是,通过<code>pip</code>安装的PEP517不支持可编辑(“-e”)开关</p>
<p>仅供参考:<code>install_with_constraints</code>是我从Claudio借用的函数,经过编辑后可在Windows上工作:</p>
<pre class="lang-py prettyprint-override"><code>def install_with_constraints(
session: Session, *args: str, **kwargs: Any
) -> None:
"""
Install packages constrained by Poetry's lock file.
This function is a wrapper for nox.sessions.Session.install. It
invokes pip to install packages inside of the session's virtualenv.
Additionally, pip is passed a constraints file generated from
Poetry's lock file, to ensure that the packages are pinned to the
versions specified in poetry.lock. This allows you to manage the
packages as Poetry development dependencies.
Arguments:
session: The Session object.
args: Command-line arguments for pip.
kwargs: Additional keyword arguments for Session.install.
"""
req_path = os.path.join(tempfile.gettempdir(), os.urandom(24).hex())
session.run(
"poetry",
"export",
" dev",
" format=requirements.txt",
f" output={req_path}",
external=True,
)
session.install(f" constraint={req_path}", *args, **kwargs)
os.unlink(req_path)
</code></pre>