繁体   English   中英

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

[英]How to import python extension module that has the same name as a pure python package with subpackages and modules?

我有一个带有 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 导入类型:

org
├── __init__.py
├── sdk
│   └── core.cpython-37m-x86_64-linux-gnu.so
└── sdk.cpython-37m-x86_64-linux-gnu.so
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

在同一个包中混合 python 和 C++ 的常见做法是使用前导下划线命名纯 C++ 模块,并在 python 模块中从中导入。

布局将如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM