如何设置我的导入以便 运行 我的 python 应用程序无需安装它,并且仍然能够 运行 使用 poetry tox?

How can I set up my imports in order to run my python application without installing it, and still be able to run tox using poetry?

我有一个 python 3.6 代码库,需要安装在环境的 site-packages 目录中才能调用和使用。将它移动到 docker 后,我决定在 docker 容器和主机之间设置一个共享卷,以避免在容器上复制和安装代码并且每次都必须重建我对代码进行了更改,并希望 运行 它。为了实现这一点,我不得不将大量导入语句从相对更改为绝对。这是应用程序的结构:

-root
  -src
    -app
  -test

为了从根目录 运行 应用程序而不安装它,我不得不从

更改很多导入语句
from app import something

至:

import src.app.something

问题是我使用 poetry 在 azure build agent 上构建应用程序,并对 运行 测试进行 tox。我的 pyproject.toml 文件的相关部分如下所示:

[tool.poetry]
name = "app"
version = "0.1.0"
packages = [{include = 'app', from='src'}]

我的 tox.ini 文件的相关部分如下所示:

[tox]
envlist = py36, bandit, black, flake8, safety
isolated_build = True

[testenv:py36]
deps =
    pytest
    pytest-cov
    pytest-env
    pytest-mock
    fakeredis
commands =
    pytest {posargs} -m "not external_service_required" --junitxml=junit_coverage.xml --cov report=html --cov-report=xml:coverage.xml

我不是毒理学或诗歌方面的专家,但据我所知,问题是 src 目录没有包含在构建工件中,只有内部应用程序目录包含在内,所以我添加了父目录并将目录结构更改为:

-root
  -app
    -src
      -app
  -test

然后将诗歌配置更改为以下以包含 src 目录

[tool.poetry]
name = "app"
version = "0.1.0"
packages = [{include = 'src', from='app'}]

现在,当我从这里更改测试中的导入时:

from app import something

对此:

from app.src.app import something 

导入在 Pycharm 中被识别,但是当我尝试 运行 tox -r 时,出现以下错误:

E   ModuleNotFoundError: No module named 'app'

我不明白 tox 如何安装应用程序,以及我需要指定哪种包结构才能从代码库目录和站点包中调用代码。我查看了一些示例项目,注意到他们不使用 isolated_build 标志,而是使用 skip_dist 标志,但不知何故,他们还在 运行ning 之前将应用程序安装在站点包中他们的测试。

如有任何帮助,我们将不胜感激。

规格:

poetry version: 1.1.6
python version:3.6.9 
tox version:3.7
environment: azure windows build agent

您必须将导入更改回 from app import somethingsrc 部分对于代码作为交付物而言是完全瞬态的。添加另一个 app 目录也是如此,您的初始项目结构很好。

你从相对导入到绝对导入是正确的,所以此后所有必要的事情就是告诉容器内的 python 运行时 root/src 应该是 [=16] 的一部分=]:

export PYTHONPATH="{PYTHONPATH}:/path/to/app/src"

或者,您也可以在导入包之前更新 python 代码中的路径:

import sys
sys.path.append("/path/to/root/src")

import app  # can be found now

很明显,以这种方式干预解释器有点老套,但据我所知,它应该可以正常工作。