Verschachtelte Python C-Erweiterungen / Module?
-
16-09-2019 - |
Frage
Wie kompilieren ich ein C-Python-Modul, so dass es zu einem anderen lokalen? Z.B. wenn ich ein Modul „bar“ genannt und ein weiteres Modul „mymodule“ genannt, wie kann ich „bar“ zu kompilieren, so dass er über „Import mymodule.bar“ importiert?
(Sorry, wenn dies schlecht formuliert ist, war ich nicht sicher, was die richtige Bezeichnung für sie war.)
Ich habe versucht, die folgenden in setup.py, aber es scheint nicht zu funktionieren:
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'])])
Bearbeiten
Danke Alex. So ist das, was ich am Ende mit:
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'])])
mit natürlich ein Ordner mit dem Namen "mymodule" enthalten __init__.py
.
Lösung
Die Anweisungen sind hier :
Extension ( 'foo', [ 'src / foo1.c', 'Src / foo2.c'])
beschreibt eine Erweiterung, die lebt in das Wurzelpaket, während
Extension ( 'pkg.foo' [ 'src / foo1.c', 'Src / foo2.c'])
beschreibt die gleiche Ausdehnung in der PKG-Paket. Die Quelldateien und Objektcode resultieren, sind identisch in der beide Fälle; der einzige Unterschied ist, wobei in dem Dateisystem (und deshalb wo in Python Namespace-Hierarchie) die resultierende Verlängerung lebt.
Denken Sie daran, ein Paket ist immer ein Verzeichnis (oder Zip-Datei) ein Modul __init__
enthält. Um ein Modul zu erstellen, die ein Paket Körper ist, wird dieses Modul aufgerufen wird __init__
und lebt unter dem Paketverzeichnis (oder ZIP-Datei). Ich habe noch nie, dass in C durchgeführt; wenn es nicht funktioniert es direkt zu tun, benennen Sie das Modul zum Beispiel _init
statt und in __init__.py
tun from _init import *
. (eines der wenigen legitimen Nutzungen von from ... import *
; -)