gpt4 book ai didi

python - 4.6 之前的 pytest 能够从与已安装的命名空间包同名的本地包导入,而现在不能。那是一个错误吗?

转载 作者:行者123 更新时间:2023-11-28 18:56:58 25 4
gpt4 key购买 nike

我克隆 this toy repository演示命名空间包的工作原理:

C:\workspace>git clone https://github.com/pypa/sample-namespace-packages.git

具体来说,我将使用其 pkg_resources 目录,该目录具有以下结构

pkg_a/
setup.py
example_pkg/
__init__.py
a/
__init__.py
pkg_b/
setup.py
example_pkg/
__init__.py
b/
__init__.py

example_pkg 包是一个 pkg_resources 风格的命名空间包(解释 here )。

我设置了我的 python 环境:

C:\workspace>\Python35\python.exe -m venv localpython

C:\workspace>localpython\Scripts\activate.bat
(localpython) C:\workspace>python -m pip install --upgrade pip setuptools

我从玩具存储库安装 pkg_a:

(localpython) C:\workspace>python -m pip install c:\workspace\sample-namespace-packages\pkg_resources\pkg_a

我将玩具库中的 pkg_b 放在我的 PYTHONPATH 中:

(localpython) C:\workspace>set PYTHONPATH=c:\workspace\sample-namespace-packages\pkg_resources\pkg_b

我为 pkg_b 编写了一个测试套件,由一行组成:

(localpython) C:\workspace>echo import example_pkg.b > test_b.py

现在,如果我在 pytest 4.5 或更低版本中运行该测试套件,它会成功:

(localpython) C:\workspace>python -m pip install pytest==4.5.0
Collecting pytest==4.5.0
...

(localpython) C:\workspace>pytest test_b.py
================================================= test session starts =================================================
platform win32 -- Python 3.5.2, pytest-4.5.0, py-1.8.0, pluggy-0.12.0
rootdir: C:\workspace
collected 0 items

============================================ no tests ran in 0.02 seconds =============================================

但是如果我在 pytest 4.6 或更高版本中运行它,它会出错:

(localpython) C:\workspace>python -m pip install pytest==4.6.0
Collecting pytest==4.6.0
...

(localpython) C:\workspace>pytest test_b.py
================================================= test session starts =================================================
platform win32 -- Python 3.5.2, pytest-4.6.0, py-1.8.0, pluggy-0.12.0
rootdir: C:\workspace
collected 0 items / 1 errors

======================================================= ERRORS ========================================================
_____________________________________________ ERROR collecting test_b.py ______________________________________________
ImportError while importing test module 'C:\workspace\test_b.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test_b.py:1: in <module>
import example_pkg.b
E ImportError: No module named 'example_pkg.b'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=============================================== 1 error in 0.08 seconds ===============================================

导入错误是可以理解的:它大概是在站点包中查找 example_pkg,因此没有找到 example_pkg 下的 b 在 PYTHONPATH 上。

然而 pytest 4.5 或更早版本设法找到 example_pkg.b

编辑:根据评论,相关区别是pytest 4.5及更早版本导入了pkg_resources。事实上,如果我添加行

import pkg_resources

在我的测试文件 test_b.py 的顶部,即使在 pytest 4.6 或更高版本中,测试也会成功。此外,如果我有多个尝试导入 example_pkg.b 的测试文件,那么在其中 pytest 最先运行的文件中导入 pkg_resources 是必要且充分的。

这意味着导入 pkg_resources 的一些副作用使得 example_pkg.b 可导入。 pkg_resources 到底做了什么来实现这种效果,我可以直接这样做而不是将其作为看似未使用的导入的副作用吗?我需要那个副作用是否意味着设置无效?

最佳答案

按照本 project 中的说明,通过 sys 导入您的包(使用 unittest 而不是 pytest)

import sys
sys.path.insert(0,"pkg_a")
sys.path.insert(0,"pkg_b")

#Test goes here

我的项目加载 test/testSpecie.py 测试 src/... 中的文件

关于python - 4.6 之前的 pytest 能够从与已安装的命名空间包同名的本地包导入,而现在不能。那是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57223017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com