如何导入与带有子包和模块的纯python包同名的python扩展模块?

时间:2019-05-02 00:44:09

标签: python package pybind11

我有一个带有pybind11扩展模块的项目,该模块以分层方式构建。

在导入时,我遇到以下问题:

1。测试1

1.1。封装结构

org
├── __init__.py
├── sdk
│   ├── core.cpython-37m-x86_64-linux-gnu.so
│   └── __init__.py
└── sdk.cpython-37m-x86_64-linux-gnu.so

1.2。从模块org.sdk导入类型:

python -c "from org.sdk import CommonType"
1.2.1。错误失败:
ImportError: cannot import name 'CommonType' from 'org.sdk' (python3.7/site-packages/org_sdk-0.0.0-py3.7-linux-x86_64.egg/org/sdk/__init__.py)

1.3。从模块org.sdk.core导入类型:

python -c "from org.sdk.core import A"
1.3.1。成功

2。测试2

已删除org/sdk/__init__.py

2.1。封装结构

org
├── __init__.py
├── sdk
│   └── core.cpython-37m-x86_64-linux-gnu.so
└── sdk.cpython-37m-x86_64-linux-gnu.so

2.2。从模块org.sdk导入类型:

python -c "from org.sdk import CommonType"
2.2.1。成功

2.3。从模块org.sdk.core导入类型:

python -c "from org.sdk.core import A"
2.3.1。错误失败:
ModuleNotFoundError: No module named 'org.sdk.core'; 'org.sdk' is not a package

我想知道如何找到两种导入都可以使用的解决方案?

默认的python加载程序似乎更喜欢org/sdk/__init__.py来加载org.sdk包,是否有可能在org / sdk / init 中添加一些代码。 py还会加载pybind11扩展模块org/sdk.cpython-37m-x86_64-linux-gnu.so吗?

1 个答案:

答案 0 :(得分:0)

在同一个程序包中混合使用python和C ++的一种常见做法是用下划线命名纯C ++模块,然后将其从python模块导入。

布局将如下所示:

org
├── __init__.py
└── sdk
    ├── __init__.py # import ._core as core
    └── _core.cpython-37m-x86_64-linux-gnu.so