Вложенные расширения/модули Python C?
-
16-09-2019 - |
Вопрос
Как скомпилировать модуль C-Python, чтобы он был локальным для другого?Например.если у меня есть модуль с именем «bar» и еще один модуль с именем «mymodule», как мне скомпилировать «bar», чтобы он импортировался через «import mymodule.bar»?
(Извините, если это неправильно сформулировано, я не был уверен, какой термин подходит для этого.)
Я попробовал в setup.py следующее, но, похоже, это не работает:
from distutils.core import setup, Extension
setup(name='mymodule',
version='1.0',
author='Me',
ext_modules=[Extension('mymodule', ['mymodule-module.c']),
Extension('bar', ['bar-module.c'])])
Редактировать
Спасибо, Алекс.Итак, вот что я в итоге использовал:
from distutils.core import setup, Extension
PACKAGE_NAME = 'mymodule'
setup(name=PACKAGE_NAME,
version='1.0',
author='Me',
packages=[PACKAGE_NAME],
ext_package=PACKAGE_NAME
ext_modules=[Extension('foo', ['mymodule-foo-module.c']),
Extension('bar', ['mymodule-bar-module.c'])])
и, конечно же, папка с именем «mymodule», содержащая __init__.py
.
Решение
Инструкции здесь:
Extension ('foo', ['src/foo1.c', 'src/foo2.c'])
описывает расширение, которое живет в корневом пакете, в то время как
Extension ('pkg.foo', ['src/foo1.c', 'src/foo2.c'])
Описывает то же расширение в пакете PKG.Исходные файлы и полученный объектный код идентичны в обоих случаях;Единственная разница заключается в том, где в файловой системе (и, следовательно, где в иерархии пространства имен Python) результирующее расширение живет.
Помните, что пакет — это всегда каталог (или zip-файл), содержащий модуль. __init__
.Чтобы создать модуль, являющийся телом пакета, этот модуль будет называться __init__
и жить в каталоге пакета (или zip-файле).Я никогда не делал этого на C;если не получается сделать это напрямую, назовите модуль, например _init
вместо этого и в __init__.py
делать from _init import *
(одно из очень немногих законных применений from ... import *
;-).