Python C emboîtée Extensions / modules?
-
16-09-2019 - |
Question
Comment compiler un module C-Python tel qu'il est local à un autre? Par exemple. si je suis un module nommé « bar » et un autre module nommé « mymodule », comment puis-je compiler « bar » de sorte qu'il a importé via « mymodule.bar import »?
(Désolé si cela est mal formulée, je ne suis pas sûr de ce que le terme approprié car il était.)
J'ai essayé ce qui suit dans setup.py, mais il ne semble pas fonctionner:
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'])])
Modifier
Merci Alex. Voilà donc ce que je fini par utiliser:
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'])])
avec bien sûr un dossier nommé "mymodule" contenant __init__.py
.
La solution
Extension ( 'foo', [ 'src / foo1.c', 'Src / foo2.c'])
décrit une extension qui vit dans le paquet de racine, tandis que
Extension ( 'pkg.foo', [ 'src / foo1.c', 'Src / foo2.c'])
décrit la même extension dans le package pkg. Les fichiers source et résultant code objet sont identiques en les deux cas; la seule différence est où dans le système de fichiers (et par conséquent où dans la hiérarchie de l'espace de noms de Python) l'extension résultante vit.
Rappelez-vous, un paquet est toujours un répertoire (ou zipfile) contenant un __init__
de module. Pour créer un module qui est un corps de package, ce module sera appelé __init__
et vivent sous le répertoire du paquet (ou zipfile). Je ne l'ai jamais fait dans C; si cela ne fonctionne pas à le faire directement, nommez le module par exemple _init
à la place, et __init__.py
faire from _init import *
. (l'une des utilisations très peu légitimes de from ... import *
; -)