[英]pytest before 4.6 was able to import from a local package with the same name as an installed namespace package, and now it isn't. Is that a bug?
我克隆了这个玩具库 ,它展示了命名空间包的工作方式
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样式的命名空间包( 在此处解释)。
我设置了我的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 ===============================================
导入错误是可以理解的:它可能是在site-packages中查找example_pkg
,因此找不到b
包,它位于PYTHONPATH的example_pkg
下。
然而,pytest 4.5或更早版本设法找到example_pkg.b
。
编辑:根据评论,相关的区别是pytest 4.5和更早的导入pkg_resources
。 的确,如果我加上这条线
import pkg_resources
在我的测试文件test_b.py的顶部,然后即使在pytest 4.6或更高版本中测试也会成功。 此外,如果我有多个尝试导入example_pkg.b
测试文件,那么导入pkg_resources
是必要且充足的,无论哪个pytest恰好先运行。
这意味着导入pkg_resources
一些副作用使得example_pkg.b
可导入。 pkg_resources
究竟做pkg_resources
什么来实现这种效果,我可以直接进行,而不是将其视为看似未使用的导入的副作用吗? 我是否需要这种副作用意味着设置无效?
通过sys导入您的包,如此项目中所写(使用unittest而不是pytest)
import sys
sys.path.insert(0,"pkg_a")
sys.path.insert(0,"pkg_b")
#Test goes here
我的项目加载test/testSpecie.py
,它测试src/...
文件src/...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.