首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置导入,以便在不安装python应用程序的情况下运行它,并且仍然能够使用诗歌运行tox?

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

Stack Overflow用户
提问于 2021-06-02 13:59:33
回答 1查看 145关注 0票数 1

我有一个python3.6代码库,它需要安装在环境的站点包目录中才能被调用和使用。将其移到docker之后,我决定在docker容器和主机之间设置一个共享卷,以避免在容器上复制和安装代码,并且每次更改代码并希望运行代码时都必须重新构建代码。为了实现这一点,我不得不将许多导入语句从相对于绝对值更改为。以下是应用程序的结构:

代码语言:javascript
复制
-root
  -src
    -app
  -test

为了在不安装根目录的情况下从根目录运行应用程序,我不得不从

代码语言:javascript
复制
from app import something

至:

代码语言:javascript
复制
import src.app.something

问题是,我使用诗歌在一个天蓝色的构建代理上构建了这个应用程序,而使用毒物测试来运行测试。我的pyproject.toml文件的相关部分如下所示:

代码语言:javascript
复制
[tool.poetry]
name = "app"
version = "0.1.0"
packages = [{include = 'app', from='src'}]

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

代码语言:javascript
复制
[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目录,所以我添加了一个父目录并将目录结构更改为:

代码语言:javascript
复制
-root
  -app
    -src
      -app
  -test

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

代码语言:javascript
复制
[tool.poetry]
name = "app"
version = "0.1.0"
packages = [{include = 'src', from='app'}]

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

代码语言:javascript
复制
from app import something

对此:

代码语言:javascript
复制
from app.src.app import something 

在Pycharm中可以识别导入,但是当我试图运行tox -r时,I会得到以下错误:

代码语言:javascript
复制
E   ModuleNotFoundError: No module named 'app'

我不明白tox是如何安装应用程序的,我需要指定什么样的包结构才能从代码基目录和站点包调用代码。我查看了一些示例项目,并注意到它们不使用isolated_build标志,而是使用skip_dist标志,但是在运行测试之前,它们也会在站点包中安装应用程序。

任何帮助都将不胜感激。

规格:

代码语言:javascript
复制
poetry version: 1.1.6
python version:3.6.9 
tox version:3.7
environment: azure windows build agent
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-02 14:31:21

您必须将导入更改为from app import something,对于可交付的代码而言,src部分是完全短暂的。在另一个app目录中添加的情况也是一样,您的初始项目结构很好。

不过,从相对导入到绝对导入是正确的,因此,此后所需要的就是告诉容器中的python运行时,root/src应该是PYTHONPATH的一部分。

代码语言:javascript
复制
export PYTHONPATH="{PYTHONPATH}:/path/to/app/src"

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

代码语言:javascript
复制
import sys
sys.path.append("/path/to/root/src")

import app  # can be found now

简单地说,用这种方式干预解释器是有点麻烦,但据我所知,它应该没有任何问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67806642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档