Как смешать код Python в модуль расширения Python - PullRequest
0 голосов
/ 23 января 2019

Допустим, у меня есть пакет Python mymodule, основанный на расширении Pybind11, где следующий код работает как чудо после запуска python setup.py install:

from mypackage.subA import foo  # foo is written in C++.
from mypackage.subB import bar  # Same for bar.

Теперь я хочу добавить чистый код Python в один из подмодулей, скажем, subA, чтобы я также мог сделать

from mypackage.subA import pure_python_func

Я сделал MCVE для такого проекта , чтобы, надеюсь, сделать это как можно яснее.

Если я добавлю файл mypackage/subA.py, в который я напишу pure_python_func (и добавлю пустой mypackage/__init__.py), я могу импортировать часть Python, но модуль расширения исчезнет. * 1017 Т.е. *

from mypackage.subA import pure_python_func  # Works
from mypackage.subA import foo  # Fails
from mypackage.subB import bar  # Fails

Мой вопрос: как я могу получить что-то, имеющее оба кода расширения и Python в одном пакете? Предпочтительно в пределах тех же самых подмодулей, но, по крайней мере, в том же пакете. Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 23 января 2019

Простой способ сделать это - встроить модуль C ++ в защищенный модуль вне вашего общедоступного модуля и импортировать этот защищенный модуль в ваш общедоступный модуль.

Например, измените mypackage.subA.foo на значение _mypackage._foo. Тогда файл mypackage/subA/__init__.py будет выглядеть примерно так:

from _mypackage._foo import *
from mypackage.subA._pythonModule import *

# Any other python code could be imported here as well
...