微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何设置导入以便在不安装 Python 应用程序的情况下运行它,并且仍然能够使用诗歌运行 tox?

如何解决如何设置导入以便在不安装 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 somethingsrc 部分对于作为可交付成果的代码而言是完全瞬态的。添加另一个 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 举报,一经查实,本站将立刻删除。