为什么子模块的代码尝试直接或通过相对导入来导入同级子模块?

库尔特·莫雷尔

我正在编写一个脚本,该脚本可以从命令行执行(通过向中添加一个entry_points参数setup.py)。我的目录结构如下:

# Edit: package hasn't followed src packaging pattern, renamed to root_dir
root_dir/
    conftest.py
    setup.py
    module1/
        __init__.py
        script1.py
        script2.py
    module2/
        __init__.py
        other_script1.py
        other_script2.py
    tests/
        conftest.py
        some_tests/
            conftest.py
            test_some_parts.py
        some_other_tests/
            conftest.py
            test_these_other_parts.py

编辑:我setup.py有一个entry_points参数,如下所示:

    entry_points={
 'console_scripts': ['load_data = module1.script1:main']
},

目前,在script1.py的顶部

try:
    from script2 import func2
except ModuleNotFoundError:
    from .script2 import func2

当我安装软件包(pip install .)并load_data通过命令行运行时,它需要from script2 import func2但是当我运行测试时,它想要from .script2 import func2我认为这很重要,但是我在src/目录(pytest tests/)中运行测试

奇怪的try/except是创可贴,使我可以运行测试和执行脚本。有没有更好的解决方案或至少是解释?

威姆

这是正确的:

from .script2 import func2

删除try / except hack。如果安装了正确的软件包,则pytest命令不应考虑您位于哪个目录下以解决导入问题。请注意,这pytest会将conftest.py发现文件的目录添加到中sys.path,这可能掩盖或加剧包装问题。

这是包装问题。你正在做的src布局错误:setup.py应该是外面的SRC根。tests子目录应与处于同一级别src重新阅读,然后再试一次(和破坏/重新创建VENV可能是可取的)。

使用src布局正确地查看流行的开源项目结构的两个示例,请使用checkout attrscryptography

最后但并非最不重要的一点是,不要因弄错它而感到难过。Python的包装是一团糟,正确处理它非常棘手。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章