【问题标题】:pytest cannot import module while python canpytest 无法导入模块,而 python 可以
【发布时间】:2017-06-04 13:06:14
【问题描述】:

我正在使用 Python 开发一个包。我使用虚拟环境。我在我的 virtualenv 中的 .pth 路径中设置了模块根目录的路径,这样我就可以在开发代码并进行测试时导入包的模块(问题 1:这是一个好方法吗?)。这很好用(这是一个例子,这是我想要的行为):

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py 
issued command: echo hello
command output: hello

但是,如果我尝试使用 PyTest,我会收到一些导入错误消息:

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile: 
collected 0 items / 1 errors 

================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
    from rc import ns
E   ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest

我有点疑惑,看起来这表示导入错误,但 Python 没问题,为什么 PyTest 会出现问题?对原因/补救措施有什么建议(问题 2)?我用谷歌搜索并堆栈溢出了 PyTest 的“ImportError:无法导入”错误,但我得到的命中与缺少 python 路径和对此的补救措施有关,这似乎不是这里的问题。有什么建议吗?

【问题讨论】:

    标签: python import pytest


    【解决方案1】:

    找到答案:

    如果您打算使用 pytest,请勿将 __init__.py 文件放在包含 TESTS 的文件夹中。我有一个这样的文件,删除它解决了问题。

    这实际上被埋在PATH issue with pytest 'ImportError: No module named YadaYadaYada'的第二个答案的cmets中所以我没有看到它,希望它在这里得到更多的可见性。

    【讨论】:

    • 有趣。我遇到了同样的问题,我必须将 init.py 添加到我的测试文件夹中。
    • 是的,这不是一个通用的解决方案(即使在你的情况下),要理解为什么应该阅读:docs.pytest.org/en/latest/goodpractices.html#test-package-name
    • 此信息错误且具有误导性!将 init.py 添加到测试文件夹后一切正常
    • @LeonardoOstan 这对您来说可能是错误的,但这并不意味着此信息通常是错误的。就我而言,它解决了这个问题。
    • 现在错了。我的测试位于project_root/tests/,源代码位于project_root/myapp/,我在project_root/tests/__init__.py 中放置了一个init 文件,以便能够在project_root/tests/test_foo.py 中导入帮助模块project_root/tests/helper.py。在project_root/ 内部,我可以使用python -m pytest -vv tests/ 运行测试。
    【解决方案2】:

    我不能说我明白为什么会这样,但我遇到了同样的问题,如果我运行 python -m pytest,测试工作正常。

    我在一个 virtualenv 中,pytest 也可以在全球范围内使用:

    (proj)tom@neon ~/dev/proj$ type -a python
    python is /home/tom/.virtualenvs/proj/bin/python
    python is /usr/bin/python
    
    (proj)tom@neon ~/dev/proj$ python -V
    Python 3.5.2
    
    (proj)tom@neon ~/dev/proj$ type -a pytest
    pytest is /home/tom/.virtualenvs/proj/bin/pytest
    pytest is /usr/bin/pytest
    
    (proj)tom@neon ~/dev/proj$ pytest --version
    This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py
    

    【讨论】:

    • 也为我完成了这项工作,问题是,它由定义的 python 版本而不是你的 v.env 运行。
    • 一个原因可能是python -m pytest [...]“也会将当前目录添加到sys.path。”
    • 在 Windows 10 中也有同样的情况,运行 python -m pytest 解决了它
    • 这在我必须运行的虚拟环境中也很有效python3 -m pytest
    • 根据@minusf 的评论,我使用PYTHONPATH=.:./src pytest 作为制作目标。
    【解决方案3】:

    我刚刚通过删除项目根目录中的__init__.py 解决了这个问题:

    .
    ├── __init__.py <--- removed
    ├── models
    │   ├── __init__.py
    │   ├── address.py
    │   ├── appointment.py
    │   └── client.py
    ├── requirements.txt
    ├── setup.cfg
    ├── tests
    │   ├── __init__.py
    │   ├── models
    │   │   ├── __init__.py
    │   │   ├── appointment_test.py
    │   │   └── client_test.py
    │   └── other_test.py
    └── script.py
    

    【讨论】:

    • 接受的答案__init__.py file in a folder containing TESTS 没有解决我的问题。这个有效。我猜这是因为文件层次结构。
    • 我已删除 __init__.py 文件。我仍然面临问题。将 conftest.py 文件添加到根目录对我有用。
    • 我希望 conftest.py 位于 /tests 而不是根目录
    • 将 conftest.py 文件放到根目录也为我修复了它。在测试目录中没有 init.py 文件
    • 这个解决方案对我有用,但有人知道这会导致导入错误吗?
    【解决方案4】:

    我遇到了同样的问题,但除了提到的原因之外还有另一个原因:

    我全局安装了 py.test,而软件包安装在虚拟环境中。

    解决方案是在虚拟环境中安装pytest。 (如果您的 shell 像 Bash 那样对可执行文件进行哈希处理,请使用 hash -r,或使用 py.test 的完整路径)

    【讨论】:

    • 刚刚意识到我有同样的偷偷摸摸的问题,使用 anaconda。我忘记在conda 创建的virtualenv 中添加pytest,但pytest 在anaconda 的根环境中可用。因此 pytest 可以被找到,但没有安装在环境中的任何包。
    • 我遇到了同样的问题。 pytest 是全局安装的,而不是在 virtualenv 中。 pip3 install pytest 在 vi​​rtualenv 中解决了这个问题。
    • 我什至将它安装在我的 venv 中,但由于某种原因它没有安装它。 (which pytest 显示了错误的版本)停用并重新激活 venv 修复了所有问题。
    【解决方案5】:

    有一个类似的问题,当我在测试目录下添加__init__.py 文件时它起作用了。

    【讨论】:

    • 而且,conftest.py 在我的情况下也是如此。
    【解决方案6】:

    只需在项目根目录下放一个空的conftest.py 文件,因为当pytest 发现conftest.py 时,它会修改sys.path,以便可以从conftest 模块中导入东西。 一般的目录结构可以是:

    Root
    ├── conftest.py
    ├── module1
    │   ├── __init__.py
    │   └── sample.py
    └── tests
        └── test_sample.py
    

    【讨论】:

    • 这是最好的答案。忘记所有__init__.py 的疯狂。
    • 对我不起作用。都很奇怪。
    【解决方案7】:

    就我而言,我在一个容器中工作,不幸的是 pytest 倾向于使用 python2.7 而不是我选择的 python3 解释器。

    在我的情况下,这有效:

    python3 -m pytest
    

    我的文件夹结构

    /
    app/
    -module1.py
    -module2.py
    -tests/
    --test_module1.py
    --test_module2.py
    requirements.txt
    README.md
    

    【讨论】:

      【解决方案8】:

      如果您有一个tests.py 文件和一个带有tests/__init__.py 的测试文件夹,则会发生此问题。

      在收集过程中pytest找到了文件夹,但是当它尝试从文件夹中导入测试文件时,tests.py文件会导致导入问题。

      要修复,只需删除 tests.py 文件并将所有测试放入 tests/ 文件夹中。

      对于您的具体情况,修复将是准确的:

      • 删除文件/home/zz/Desktop/GitFolders/rc/tests.py
      • 确保/home/zz/Desktop/GitFolders/rc/tests/__init__.py 存在

      【讨论】:

        【解决方案9】:

        在我的情况下,发生导入错误是因为包指向另一个具有同名的包/目录,并且它的路径比我实际想要的文件夹高一级。 我认为这也解释了为什么有些人需要删除 _ init _.py 而其他人需要添加回来。

        我只是将print(the_root_package.__path__)(在import the_root_package 之后)放在python 控制台和pytest 脚本中以比较差异

        底线:当您执行python 时,您导入的包可能与您运行pytest 时的包不同。

        【讨论】:

          【解决方案10】:

          请在此处查看:https://docs.pytest.org/en/documentation-restructure/background/pythonpath.html

          我遇到了 pytest 问题(已使用 python -m pytest 解决);错误是

          FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/...
          

          我发现问题在tests/tests/subfolders 中丢失了__init__.py

          【讨论】:

          • 对我不起作用
          【解决方案11】:

          我有一个类似的问题,完全相同的错误,但不同的原因。我运行测试代码很好,但是针对的是旧版本的模块。在我的代码的先前版本中,存在一个类,而另一个则不存在。更新我的代码后,我应该运行以下命令来安装它。

          sudo pip install ./ --upgrade

          安装更新后的模块运行 pytest 产生了正确的结果(因为我使用了正确的代码库)。

          【讨论】:

          • 这对我有用!我的模块同时作为库安装在我用来运行 pytest 的 docker 容器中。运行 python 解释器时,它会找到更新的代码,但 pytest 会继续查找代码,就像第一次安装库时一样。运行pip install ./ --upgrade 用最新代码更新了已安装的lib 版本,并使pytest 也能找到这个最新版本。
          【解决方案12】:

          将软件包安装到您的虚拟环境中。
          然后启动一个新的 shell 并再次获取您的虚拟环境。

          【讨论】:

            【解决方案13】:

            我是使用 VSCode 得到的。我有一个 conda 环境。我不认为 VScode python 扩展可以看到我正在做的更新。

            python c:\Users\brig\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\testing_tools\run_adapter.py discover pytest -- -s --cache-clear test
            Test Discovery failed:
            

            我不得不跑pip install ./ --upgrade

            【讨论】:

            • 那个 pip 命令返回错误:Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
            【解决方案14】:

            我今天遇到了这个问题,并通过从我的项目目录的根目录调用 python -m pytest 解决了它。

            从同一位置呼叫 pytest 仍然会导致问题。

            我的项目目录组织为:

            api/
             - server/
              - tests/
                  - test_routes.py
              - routes/
                  - routes.py
             - app.py
            

            模块routes在我的test_routes.py中导入为:from server.routes.routes import Routes

            希望有帮助!

            【讨论】:

            • 感谢提醒,我过去不得不使用这个技巧,它在 pytest 文档中。
            【解决方案15】:

            我不同意那些说您必须删除任何 __init__.py 文件的帖子。你必须做的是改变sys.path

            运行一个实验,在正常运行代码时打印sys.path。 然后在通过 pytest 运行代码时打印sys.path。我想您会发现这两条路径之间存在差异,因此 pytest 会中断。

            要解决此问题,请在第二个实验的第 0 个索引处插入第一个实验的路径。

            '/usr/exampleUser/Documents/foo' 成为实验1 中print(sys.path) 的第一个元素。

            以下是可以解决您的问题的代码:

            import sys sys.path[0] = '/usr/exampleUser/Documents/foo'

            将其放在文件顶部,在实际导入语句之前。

            来源:我自己正在处理这个问题,上面的过程解决了它。

            【讨论】:

            • 这里列出的唯一对我有用的解决方案。
            【解决方案16】:

            我已将所有测试放在一个测试文件夹中,但遇到了同样的错误。我通过在该文件夹中添加__init__.py 解决了这个问题,如下所示:

            .
            |-- Pipfile
            |-- Pipfile.lock
            |-- README.md
            |-- api
            |-- app.py
            |-- config.py
            |-- migrations
            |-- pull_request_template.md
            |-- settings.py
            `-- tests
                |-- __init__.py <------
                |-- conftest.py
                `-- test_sample.py
            

            【讨论】:

            • 对我不起作用。
            • 你遇到了什么错误@mikerodent
            【解决方案17】:

            另一个建议

            我在 SO 和其他地方探索了这个问题和其他各种问题......所有关于在项目目录结构的各个部分中添加(或删除)一个空的 __init__.py 和/或 conftest.py 的东西,所有的东西关于 PYTHONPATH 等,等等:这些解决方案都不适合我,实际上是一个非常简单的情况,不应该引起任何悲伤。我认为这是 pytest 当前设置中的一个缺陷。

            我的项目结构:

            project_root
                src
                    core
                        __init__.py
                        __main__.py
                        my_other_file.py 
                tests
                    basic_tests
                        first_tests.py
            

            引入的问题:很简单,__main__.py 有一行import my_other_file。当我只运行应用程序时,这(不足为奇)工作正常,即从根目录运行 python src/core

            但是当我使用导入 __main__.py 的测试运行 pytest 时,我得到了

            ModuleNotFoundError: No module named 'my_other_file'
            

            __main__.py 中尝试导入“my_other_file”的行上。请注意,就我而言,这里的问题是,在 pytest 测试过程中,一个应用程序文件无法在同一个包中找到另一个应用程序文件

            使用 PYTHONPATH
            经过大量实验,将__init__.py 文件和confest.py 文件放在我能找到的几乎每个目录中(我认为关键文件是__init__.py 添加到“tests”和“basic_tests”中,见上面的目录结构),然后将 PYTHONPATH 设置为如下

            PYTHONPATH=D:\My Documents\software projects\EclipseWorkspace\my_project\src\core
            

            ...我发现它有效。测试文件中的导入必须稍微调整一下,一般模式是from core import app, project,但测试文件能够“看到”core,关键是没有必要搞乱import中的命令应用程序文件。

            但是...由于某种原因,现在使用这种方法运行的测试要慢得多!与我下面的解决方案相比,可以看到 core 包只加载了一次,我怀疑 PYTHONPATH 解决方案可能会导致大量代码一次又一次地重新加载。我还不能确认这一点,但我看不到任何其他解释。

            替代方案
            我的替代相当简单的解决方案是这样的:

            1 - 在该应用程序包中的__init__.py(即目录“core”)中,放入以下两行:

            import pathlib, sys
            sys.path.append(str(pathlib.Path(__file__).parent))
            

            NB 当然,__init__.py 中通常没有任何内容。事实证明,正如我通过实验所证实的那样,pytest 通常(请参阅下面的更新)在这种情况下执行__init__.pypytest 完成了它所做的任何事情之后增加sys.path 条目。

            2 - 是的,您还必须在目录“核心”。希望这应该是您需要的唯一 conftest.py:我对所有这些进行了试验,没有必要将一个放在根目录中(如果没有 __init__.py 中的建议代码,它也不能解决问题)。

            3 - 最后,在我的测试函数中,在我的示例中调用 core.__main__ 之前,我必须导入我知道即将导入的文件:

            import core.my_other_file
            import core.__main__ 
            

            如果您在文件的第一个测试中执行此操作,您会发现 sys.modules 已为该文件中的所有其他测试设置。更好的是,在第一次测试之前,将import core.my_other_file 放在文件的最开头。不幸的是,from core import * 似乎不起作用。

            稍后:这种方法有一些特殊性和局限性。例如,虽然-k 开关可以正常过滤输入/输出测试或整个文件,但如果你执行pytest tests/tests_concerning_module_x 之类的操作,core.__init__.py 似乎不会运行......所以核心模块中的文件在测试期间再次相互不重要。其他限制可能会暴露出来......


            正如我所说,我认为这是 pytest 设置中的一个缺陷。我完全不知道 pytest 为sys.path 建立常识设置做了什么,但它显然弄错了。应该没有必要依赖 PYTHONPATH 或其他任何东西,如果这确实是“官方”解决方案,那么关于这个主题的文档非常缺乏

            注意我的这个建议有一个问题:每次pytest在模块中运行__init__.py时添加sys.path,这意味着此后这条新路径在sys.path中变为永久,在测试期间,更令人担忧的是,在应用程序本身运行期间,如果有任何实际调用__init__.py。 (顺便说一句,只是去python src/core(在我的例子中)不会导致这种情况发生。但其他事情可能会发生。)

            为了解决这个问题,我有一个笨拙但有效的解决方案:

            import pathlib, sys, traceback
            frame_list = traceback.extract_stack()
            if len(frame_list) > 2:
                path_parts = pathlib.Path(frame_list[2].filename).parts
                if len(path_parts) > 2 and path_parts[-3:-1] == ('Scripts', 'pytest.exe'):
                    sys.path.append(str(pathlib.Path(__file__).parent))
                    return
            # print('sys.path unchanged...')
            

            这显然是基于我在 pytest 在 W10 上下文中运行某些东西时对堆栈跟踪的检查。在 *nix 中会有所不同(请随意编辑以添加等效项)。

            注意,上面pathlib.Path(frame_list[2].filename).parts 中的最后一个元素是字符串__main__.py。虽然,如果您在“脚本”下检查您的虚拟环境,您会发现“pytest.exe”毫无疑问是一个文件,而不是一个目录,但这里的 __main__.py 似乎并没有在您的应用程序中引用该名称的文件包:无论您在 pytest 测试中导入什么文件,这始终是(似乎)最后一个元素,因此您可能可以比较所有 3 个最后一个 parts

            当然,这可能会与 pytest 的未来版本中断。我的版本是 6.2.5。

            【讨论】:

              【解决方案18】:

              我通过在环境变量中为我运行测试的特定配置设置 PYTHONPATH 解决了我的问题。

              当您在 PyCharm 上查看测试文件时:

              1. Ctrl + Shift + A
              2. 输入Edit Configurations
              3. 在环境 > 环境变量下设置您的 PYTHONPATH

              更新

              1. 移动到项目的根目录
              2. 创建虚拟环境
              3. 激活您新创建的虚拟环境
              4. 将变量$PYTHONPATH 设置为项目的根目录并导出:
              export PYTHONPATH=$(pwd)
              
              1. 请勿从tests/ 目录或src/ 目录中删除__init__.py

              另请注意:

              • 您的目录的根目录不是 python 模块,所以不要添加__init__.py
              • conftest.py 在项目的根目录中不是必需的。
              1. $PYTHONPATH 变量仅在当前终端/控制台会话期间可用;所以你每次都需要设置这个。 (如果您在 pycharm 中工作,可以按照本次更新之前的步骤操作)。

              【讨论】:

              • 作为一个明确的示例,我将 PyCharm pytest 运行配置中的 Environment variables: 字段设置为 PYTHONPATH=/my_projects_root_dir:$PYTHONPATH
              【解决方案19】:

              另一种特殊情况:

              我在使用 tox 时遇到了问题。所以我的程序运行良好,但通过 tox 的单元测试一直在抱怨。 安装包(程序所需)后,您需要在 tox.ini 中额外指定单元测试中使用的包

              [testenv]
              deps =
                  package1
                  package2 
              ...
              

              【讨论】:

                【解决方案20】:

                上面的答案对我不起作用。我只是通过将未找到的模块的绝对路径附加到test_xxx.py(您的测试模块)顶部的sys.path 来解决它,例如:

                import sys
                sys.path.append('path')
                

                【讨论】:

                • 我没有将这些行放在我的test_main.py 的顶部,而是将它放在我的测试目录中的conftest.py 中,并且它起作用了。感谢您提供程序化解决方案,而不是文件垃圾。
                【解决方案21】:

                如果它与最初在 python 2.7 中开发并现在迁移到 python 3.x 的 python 代码有关,则问题可能与导入问题有关。

                例如 从文件中导入对象时:base 位于同一目录中,这将在 python 2.x 中工作:

                from base import MyClass
                

                在 python 3.x 中,您应该替换为 base 完整路径或 .base 不这样做会导致上述问题。 所以试试:

                from .base import MyClass
                

                【讨论】:

                  【解决方案22】:

                  这里是a medium article!描述问题!

                  问题在于您使用的是哪个 pytest 以及您对虚拟环境的使用。 如果你已经在系统范围内安装了 pytest,换句话说,在虚拟环境之外,pytest 有一个讨厌的习惯,就是只在你的虚拟环境之外寻找模块!如果您的项目使用的模块仅安装在您的虚拟环境中,并且您使用的是系统范围的 pytest,即使您已激活虚拟环境,它也不会找到该模块。1

                  这是一步一步的:1

                  1. 退出任何虚拟环境
                  2. 使用 Pip 卸载 pytest
                  3. 激活项目的虚拟环境
                  4. 在虚拟环境中安装 pytest
                  5. pytest 现在将找到您的仅虚拟环境包!

                  【讨论】:

                  • 对我不起作用
                  【解决方案23】:

                  保持一切不变,只是在根文件夹中添加了一个空白测试文件..解决了它

                  这是调查结果,这个问题确实困扰了我一段时间。 我的文件夹结构是

                  mathapp/
                      - server.py  
                      - configuration.py 
                      - __init__.py 
                      - static/ 
                         - home.html  
                  tests/            
                      - functional 
                         - test_errors.py 
                      - unit  
                         - test_add.py
                  

                  pytest 会向ModuleNotFoundError 投诉并给出提示:

                  确保您的测试模块/包具有有效的 Python 名称。

                  我在 mathsapp 和 tests 目录中引入了一个模拟测试文件。该文件不包含任何内容。现在 pytest 不会抱怨了。

                  没有文件的结果

                  $ pytest
                  ============================= test session starts =============================
                  platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
                  rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
                  collected 1 item / 1 error
                  
                  =================================== ERRORS ====================================
                  _______________ ERROR collecting tests/functional/test_func.py ________________
                  ImportError while importing test module 'C:\mainak\workspace\0github\python-rest-app-cont\tests\functional\test_func.py'.
                  Hint: make sure your test modules/packages have valid Python names.
                  Traceback:
                  tests\functional\test_func.py:4: in <module>
                      from mathapp.service import sum
                  E   ModuleNotFoundError: No module named 'mathapp'
                  =========================== short test summary info ===========================
                  ERROR tests/functional/test_func.py
                  !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
                  ============================== 1 error in 0.24s ===============================
                  

                  文件结果

                  $ pytest
                  ============================= test session starts =============================
                  platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
                  rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
                  collected 2 items
                  
                  tests\functional\test_func.py .                                          [ 50%]
                  tests\unit\test_unit.py .                                                [100%]
                  
                  ============================== 2 passed in 0.11s ==============================
                  

                  【讨论】:

                  • 在解决这个问题很长时间后,这对我有用。似乎 pytest 将项目根目录视为找到第一个测试文件的地方?确定这是一个错误吗?
                  • 哇,这对我有用。我仍然必须使用 python3 -m pytest 但添加一个空白测试文件解决了这个问题。
                  【解决方案24】:

                  对于尝试了所有方法但仍然出错的人,我有一个解决方法。

                  安装pytest的文件夹中,进入pytest-env文件夹。

                  打开 pyvenv.cfg 文件。

                  在文件中将 include-system-site-packagesfalse 更改为 true

                  home = /usr/bin
                  include-system-site-packages = true
                  version = 3.6.6
                  

                  希望它有效。不要忘记投票。

                  【讨论】:

                  • 没有这样的文件夹。 site-packages 下只有 pytest,没有 .cfg 文件。奇怪。
                  【解决方案25】:

                  Python 的导入系统又一次大获全胜。我认为没有达成共识的原因是什么工作可能取决于你的环境和你在它之上使用的工具。

                  我在 VS Code 中使用它,在 conda 环境 Python 3.8 中的 Windows 下的测试资源管理器中使用它。

                  我必须进行的设置是:

                  mypkg/
                      __init__.py
                      app.py
                      view.py
                  tests/
                      test_app.py
                      test_view.py
                  

                  在此设置下,智能感知有效,测试发现也有效。

                  请注意,我最初尝试了以下操作,推荐 here

                  src/
                      mypkg/
                          __init__.py
                          app.py
                          view.py
                  tests/
                      test_app.py
                      test_view.py
                  

                  我无法从 VS Code 中得到它,因为 src 文件夹只是让导入系统大吃一惊。我可以想象有一种方法可以让它从命令行工作。作为一个相对较新的 Python 编程转换者,它让我有一种使用 COM 工作的怀旧感觉,但没有那么有趣。

                  【讨论】:

                    【解决方案26】:

                    我的 2 美分:如果您不使用虚拟环境,pytest 会偶然失败。有时它会起作用,有时不会。

                    因此,解决方案是:

                    • 使用 pip 卸载删除 pytest
                    • 创建你的 venv
                    • 激活你的venv
                    • pip 以可编辑模式安装您的项目路径,因此 pytest 会将其视为模块(否则,pytest 不会找到您的内部导入)。为此,您需要一个 setup.py 文件
                    • 安装你的包,包括 pytest
                    • 最后,运行测试

                    代码,使用 Windows PowerShell:

                    pip uninstall pytest
                    python.exe -m venv my_env
                    .\my_env\Scripts\activate
                    (my_env) pip install -e .
                    (my_env) pip install pytest pytest-html pandas numpy
                    

                    最后

                    (my_env) pytest --html="my_testing_report.html"
                    

                    setup.py 示例,用于 pip install -e:

                    import setuptools
                    
                    setuptools.setup(
                        name='my_package',
                        version='devel',
                        author='erickfis',
                        author_email='erickfis@gmail.com',
                        description='My package',
                        long_description='My gooood package',
                        packages=setuptools.find_packages(),
                        classifiers=[
                            'Programming Language :: Python :: 3',
                            'Operating System :: OS Independent',
                        ],
                        include_package_data=True
                    )
                    

                    【讨论】:

                      【解决方案27】:

                      我在那里找到答案:点击here

                      如果您有其他项目结构,请将 conftest.py 放在包根目录中(包含包但本身不是包的目录,因此不包含 init.py)

                      【讨论】:

                        【解决方案28】:

                        可能是 Pytest 没有将包作为 Python 模块读取,而 Python 是(可能是由于路径问题)。尝试更改 pytest 脚本的目录或将模块显式添加到 PYTHONPATH。

                        或者您的机器上安装了两个版本的 Python。检查您的 Python 源代码以获取 pytest 和您运行的 python shell。如果它们不同(即 Python 2 与 3),请使用 source activate 确保您正在运行为安装模块的同一 python 安装的 pytest。

                        【讨论】:

                          【解决方案29】:

                          如果您的文件夹中需要 init.py 文件,请复制该文件夹并删除其中的 init.py 以运行您的测试,它适用于本地项目。如果您需要定期运行测试,请查看是否可以将 init.py 移动到单独的文件中。

                          【讨论】:

                            【解决方案30】:

                            [已解决] 在直接进入删除/添加__init__.py 的解决方案之前,我们可能还想看看在您的类中是如何完成导入的。实际上,我只是在__init__.py 上玩了一整天,以为这可能是问题所在:) 但是,这提供了很多信息。

                            在我的例子中,将类从一个 python 类调用到另一个抛出 ImportError 的 python 类是错误的。修复了调用类/模块的方式,它就像魅力一样工作。希望,这对其他人也有帮助。

                            是的,对于类似的错误,我们可能有不同的解决方案,具体取决于代码的编写方式。最好花更多时间进行自我调试。经验教训 :) 编码愉快!!!

                            【讨论】:

                            • 您能举出一些错误方式和正确方式的例子吗?
                            猜你喜欢
                            • 2023-04-05
                            • 2013-08-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-12-08
                            相关资源
                            最近更新 更多