如何解决如何设置导入以便在不安装 Python 应用程序的情况下运行它,并且仍然能够使用诗歌运行 tox?
我有一个 python 3.6 代码库,它需要安装在环境的 site-packages 目录中才能被调用和使用。将其移至 docker 后,我决定应该在 docker 容器和主机之间设置一个共享卷,以避免在容器上复制和安装代码,并且每次更改代码时都必须重新构建和想运行它。为了实现这一点,我不得不将很多导入语句从相对更改为绝对。这是应用程序的结构:
-root
-src
-app
-test
为了在不安装的情况下从根目录运行应用程序,我不得不从
更改了很多导入语句from app import something
到:
import src.app.something
问题是我使用诗歌在 azure 构建代理上构建应用程序,并使用 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 标志,但不知何故,他们还在运行测试之前将应用程序安装在站点包中。
任何帮助将不胜感激。
规格:
poetry version: 1.1.6
python version:3.6.9
tox version:3.7
environment: azure windows build agent
解决方法
您必须将导入改回 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
很明显,以这种方式干预解释器有点麻烦,但据我所知,它应该可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。