什么时候假设使用破折号 m 并避免使用 __init__?

When to assume dash m usage and avoid __init__?

对于Python 3.

我刚开始学习Python。我有 PHP 和 Ruby 背景。

目前对模块非常困惑,__init__python -m

目前我有以下内容:

modules/practice.py
tests/test_practice.py

在practice.py

class First:
  def attempt(self):
    return 'attempted'

测试中_practice.py

from modules.practice import First

class TestMain:
  def test_attempt(self):
    first = First()
    attempted = first.attempt()
    assert attempted is 'attempted'

当我 运行 pytest 我得到一个错误 ModuleNotFoundError: No module named 'modules

当我运行python -m pytest测试是绿色的

但是,如果我在模块和测试中添加 __init__.py 个文件,两者都是绿色的。

在尝试自己找出答案后,我承认我不确定自己是否明白了。

为什么 pytest 在没有 __init__ 的情况下不起作用?

在处理项目时,当人们认为 python -m 将被使用,而当人们添加 __init__.py 文件时?

不要将 __init__.py 文件添加到 tests 目录中。

您应该将 __init__.py 文件添加到 modules 目录中。

理想情况下,应该可以使用 pytestpython -m pytest 运行 测试套件。为此,modules 的父目录需要出现在 sys.path 上。通常你会通过为包编写一个 setup.py 文件并以“可编辑”模式安装你的代码来做到这一点。针对站点包中链接的已安装代码的测试 运行。

如果你不想在这个阶段写一个setup.py文件,你可以导出一个环境变量:

export PYTHONPATH=/path/to/parent_of_modules

或者您可以直接从 conftest.py 文件注入到 sys.path,该文件首先导入:

.
├── modules
│   ├── __init__.py
│   └── practice.py
└── tests
    ├── conftest.py
    └── test_practice.py

示例:

# conftest.py
import os
import sys

here = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(here))