我有一个python3.6代码库,它需要安装在环境的站点包目录中才能被调用和使用。将其移到docker之后,我决定在docker容器和主机之间设置一个共享卷,以避免在容器上复制和安装代码,并且每次更改代码并希望运行代码时都必须重新构建代码。为了实现这一点,我不得不将许多导入语句从相对于绝对值更改为。以下是应用程序的结构:
-root
-src
-app
-test为了在不安装根目录的情况下从根目录运行应用程序,我不得不从
from app import something至:
import src.app.something问题是,我使用诗歌在一个天蓝色的构建代理上构建了这个应用程序,而使用毒物测试来运行测试。我的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我不是tox或诗歌方面的专家,但据我所知,问题是src目录没有包含在构建工件中,只有内部app目录,所以我添加了一个父目录并将目录结构更改为:
-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时,I会得到以下错误:
E ModuleNotFoundError: No module named 'app'我不明白tox是如何安装应用程序的,我需要指定什么样的包结构才能从代码基目录和站点包调用代码。我查看了一些示例项目,并注意到它们不使用isolated_build标志,而是使用skip_dist标志,但是在运行测试之前,它们也会在站点包中安装应用程序。
任何帮助都将不胜感激。
规格:
poetry version: 1.1.6
python version:3.6.9
tox version:3.7
environment: azure windows build agent发布于 2021-06-02 14:31:21
您必须将导入更改为from app import something,对于可交付的代码而言,src部分是完全短暂的。在另一个app目录中添加的情况也是一样,您的初始项目结构很好。
不过,从相对导入到绝对导入是正确的,因此,此后所需要的就是告诉容器中的python运行时,root/src应该是PYTHONPATH的一部分。
export PYTHONPATH="{PYTHONPATH}:/path/to/app/src"或者,您也可以在导入包之前更新python代码中的路径:
import sys
sys.path.append("/path/to/root/src")
import app # can be found now简单地说,用这种方式干预解释器是有点麻烦,但据我所知,它应该没有任何问题。
https://stackoverflow.com/questions/67806642
复制相似问题