Nested Python C Extensions / Módulos?
-
16-09-2019 - |
Pergunta
Como faço para compilar um módulo C-Python tal que é local para outro? Por exemplo. Se eu tiver um módulo chamado "bar" e outro módulo chamado "mymodule", como faço para compilar "bar" para que ele importados via "mymodule.bar importação"?
(Desculpe se isso é mal formulada, eu não tinha certeza do que o termo apropriado para que era.)
Eu tentei o seguinte em setup.py, mas não parecem funcionar:
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'])])
Editar
Graças Alex. Então é isso que eu acabei usando:
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'])])
com, claro, uma pasta chamada "mymodule" contendo __init__.py
.
Solução
As instruções são aqui :
Extensão ( 'foo', [ 'src / foo1.c', 'Src / foo2.c'])
descreve uma extensão que vive em o pacote de raiz, enquanto
Extensão ( 'pkg.foo', [ 'src / foo1.c', 'Src / foo2.c'])
descreve a mesma extensão na pacote pkg. Os arquivos de origem e resultando código de objecto são idênticos em ambos os casos; a única diferença é em que no sistema de ficheiros (e, por conseguinte onde na hierarquia de namespace do Python) a vida de extensão resultante.
Lembre-se, um pacote é sempre um diretório (ou arquivo zip) contendo uma __init__
módulo. Para criar um módulo que é um corpo de pacote, esse módulo será chamado __init__
e viver sob o diretório do pacote (ou arquivo zip). Eu nunca fiz isso em C; Se ele não funciona para fazê-lo diretamente, o nome do módulo de exemplo _init
vez, e em __init__.py
fazer from _init import *
(uma das poucas utilizações legítimas do from ... import *
; -).