繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM