我正在使用 pytest。注意 W10。
我将通过运行我的应用程序> python src/core
。“core”是我的中心模块,带有一个__main__.py
文件。
因此,我将“tests”目录放在[项目根目录]/src/core 中。
我有一个测试文件 test_xxx.py。在其中我尝试导入__main__
:
import __main__
...
def test_xxxxx():
print(f'main {__main__} type {type(__main__)}')
这将打印以下内容:
main <module '__main__' from 'D:\\apps\\Python\\virtual_envs\\doc_indexer v2.0.0\\Scripts\\pytest.exe\\__main__.py'> type <class 'module'>
...换句话说,它不是从本地“核心”模块导入我的本地模块,而是从其模块__main__.py
导入 pytest 自己的模块。__main__
到目前为止还算可以理解。然后我查看 sys.path:
path: D:\My Documents\software projects\EclipseWorkspace\doc_indexer\src\core\tests
path: D:\My Documents\software projects\EclipseWorkspace\doc_indexer\src\core
path: D:\apps\Python\virtual_envs\doc_indexer v2.0.0\Scripts\pytest.exe
path: D:\apps\Python\PyQt5
...
现在我正在挠头,这不是第一次使用 pytest。此 ...src\core 路径列在...Scripts\pytest.exe之前。为什么 pytest在从它之前的路径导入之前会识别自己的__main__.py
并导入它?__main__.py
我也尝试过各种实验importlib
。似乎什么都不起作用。
那么一般来说,有什么方法可以实际导入该文件 ...src/core/ 吗__main__py
?
我意识到这个文件在传递到另一个文件之前应该做最少的事情,但为了完整性,我只想测试它main()
实际上是否做到了这一点。有什么办法可以__main__.main()
在测试中运行吗?
__main__
每个 Python 程序都会根据正在执行的脚本创建一个在启动时命名的模块。因此,
import __main__
总是会找到具有该名称的模块,这意味着它不需要从名为__main__.py
. 在你的例子中,你执行了pytest
(这主要是一个简单的包装器import pytest; pytest.console_main()
。(脚本pytest
存储在你的搜索路径上的目录中,与你的Python库中定义的模块是分开的pytest.py
。)一种解决方案是确保您可以
__main__.py
使用另一个包导入,这样它就somepackage.__main__
不同于__main__
.但是,
__main__.py
绝不打算作为模块导入。当您尝试将目录或存档文件作为脚本执行时,它是定义脚本的文件。如果它包含需要测试的代码,我建议将其分解为一个单独的模块并__main__.py
自行导入。