英文:
How to import a module in Python unit test?
问题
。
├── mymodule
│ ├── __init__.py
│ └── foo.py
├── tests
├── __init__.py
├── utils.py
└── test_module.py
我有上述的目录结构用于我的Python包。
在test_module.py
文件中,我需要导入tests/utils.py
。我应该如何导入它,以便我可以通过以下两种方式运行测试:
python tests/test_module.py
pytest
从根目录?
目前,我在test_module.py
文件中导入了tests/utils.py
如下:
from utils import myfunction
然后,pytest
会生成以下错误:
E ModuleNotFoundError: No module named 'utils'
如果我更改为:
from .utils import myfunction
然后,pytest
可以正常工作,但python tests/test_module.py
会生成以下错误:
ImportError: attempted relative import with no known parent package
我应该如何正确地导入utils.py
,以便我可以两种方式都使用它?
<details>
<summary>英文:</summary>
.
├── mymodule
│ ├── init.py
│ └── foo.py
├── tests
├── init.py
├── utils.py
└── test_module.py
I have the above directory structure for my Python package.
Within the `test_module.py` file, I need to import `tests/utils.py`. How should I import it so that I can run the test by using both
- `python tests/test_module.py`
- `pytest`
from the root directory?
Currently, I imported `tests/utils.py` as follows in the `test_module.py` file:
```python
from utils import myfunction
Then, pytest
will generate the following error:
E ModuleNotFoundError: No module named 'utils'
If I change to:
from .utils import myfunction
Then, pytest
works fine, but python tests/test_module.py
generates the following error:
ImportError: attempted relative import with no known parent package
How can I properly import utils.py
so that I can use in both ways?
答案1
得分: 1
-
当你从根目录使用
pytest
运行测试时,test_module.py
会作为一个Python模块启动,因此允许相对导入。 -
当你使用
python tests/test_module.py
运行测试时,它会作为脚本启动,不允许相对导入。但是Python会将{根目录}/tests
目录添加到sys.path
中,所以你可以这样导入:from utils import myfunction
你可以结合这两种情况使用以下方式:
try:
from .utils import myfunction
except ImportError:
from utils import myfunction
为了避免这个 try
语句,另一种解决方案是从根目录使用 python3 -m tests.test_module
运行脚本(参考 PEP 338)。在这种情况下,test_module.py
作为一个模块加载,相对导入 from .utils import myfunction
将正常工作。
英文:
-
When you run test with
pytest
from root directory,test_module.py
is launch as a python module, so relative import is allowed. -
When you run test with
python tests/test_module.py
, it is launch as script and relative import is not allowed. But python adds{root directory}/tests
directory tosys.path
. So you can import with:from utils import myfunction
You can mix these 2 cases with:
try:
from .utils import myfunction
except ImportError
from utils import myfunction
To avoid this try
statement, another solution is to run the script with python3 -m tests.test_module
from the root directory (PEP 338). In this case test_module.py
is loaded as a module and the relative import from .utils import myfunction
works fine.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论