ImportError: dynamisches Modul definiert keine Init-Funktion (initfizzbuzz)
Lesezeit: 5 Minuten
SamuraiT
Ich habe versucht zu kompilieren fizzbuzz.c, um es per Python zu importieren. Zum Bauen fizzbuzz.c,Ich benutzte python setup.py build_ext -i.
Nachdem ich es erstellt hatte, versuchte ich zu importieren fizzbuzz.c aber der folgende Fehler ist aufgetreten. Wie kann ich dieses Problem lösen?
Fehler
>>> import fizzbuzz
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initfizzbuzz)
fizzbuzz.c
#include <stdio.h>
void fizzbuzz(int n){
for (int i=1; i <= n; i++){
if (i % 3 == 0 && i % 5 ==0){
printf("fizzbuzz %d \n", i);
}
else if (i % 3 == 0){
printf("fizz %d \n", i);
}
else if(i % 5 == 0){
printf("buzz %d \n", i);
}
}
}
Für die Nachwelt, wenn Sie zwei Dateien haben fizzbuzz.so und ein (richtig geschriebener ctypes-Wrapper) fizzbuzz.py im selben Verzeichnis, und Sie versuchen es import fizzbuzzPython scheint das zu bevorzugen .sowas ebenfalls diese Fehlermeldung erzeugt.
Beim Einbinden in Python mit import libfoo folgender Fehler tritt auf:
ImportError: dynamic module does not define init function (PyInit_libfoo)
Dies liegt daran, dass „libhello“ und „libfoo“ nicht übereinstimmen.
Wow! Dieser kleine Ausschnitt war für mich hilfreicher als die meisten Boost-Dokumente!
– Salbei
23. September 2015 um 19:53 Uhr
Wo kommt die libemotion Namen kommen?
– Martijn Pieters ♦
3. September 2016 um 6:43 Uhr
Benachrichtigung wert – Derselbe Fehler kann auftreten, wenn die Bibliothek für eine andere Python-Version kompiliert wird. Zum Beispiel, wenn das gemeinsame Objekt für Python 3 ist, aber Sie versuchen, ein Modul aus Python 2 zu importieren.
initfizzbuzz ist das Benennungsschema von python2, das python3 benötigt PyInit_libfizzbuzz. Wenn Sie also wissen, dass Ihre Bibliothek für Python3 erstellt wurde, erhalten Sie die Fehlermeldung msg. In der ursprünglichen Frage ist wahrscheinlich ein Python2-Interpreter in die Quere gekommen. Das ist mir mit einem Conda-Env passiert. mit python 3.6 und einem system python2.7 beim aufbau der dokumentation für mein modul mit sphinx.
– Fred Schön
7. Juli 2017 um 11:06 Uhr
Das war auch mein Fall. Ich habe den Python-Wrapper mit Python3.6 kompiliert und habe versucht, meine Bibliothek mit Python2.7 zu importieren. Vielen Dank für diesen Kommentar!
– Carlo Ost
6. März 2019 um 13:17 Uhr
Martijn Pieters
Python kann und kann beliebige C-Dateien nicht als Module unterstützen. Sie müssen bestimmten Konventionen folgen, um Python mitzuteilen, welche Funktionen Ihr Modul unterstützt.
Dazu sucht Python nach a init<name> Funktion, wo <name> ist der Modulname. Python suchte initfizzbuzz konnte es aber nicht finden, sodass das Laden des Moduls fehlgeschlagen ist.
Abgesehen von einem Initialisierer müssen Sie auch eine Struktur angeben, die angibt, welche Funktionen verfügbar sind, und Ihre Funktion muss Python-Typen als Argumente verarbeiten. Python stellt Ihnen die notwendigen Hilfsfunktionen und Definitionen zur Verfügung, um dies einfach genug zu machen.
Der Name muss exakt sein, mit dem Sie boost und boost-python kompilieren: brew reinstall boost –with-python3 –without-python brew reinstall boost-python –with-python3 –without-python
nachlässig
Sie sollten eine Funktion mit dem Namen definieren init_fizzbuzz, die den Code zum Initialisieren des Moduls enthalten sollte. Diese Funktion sollte auch aufrufen Py_InitModule, um die Bindungen für die c-Funktionen in Python einzurichten. Weitere Informationen finden Sie unter dieses Tutorial.
In Ihrem Fall sollte Ihr Code in etwa so angepasst werden:
static PyObject* py_fizzbuzz(PyObject* self, PyObject* args)
{
int value;
if (!PyArg_ParseTuple(args, "i", &value))
return NULL;
for (int i=1; i <= n; i++){
if (i % 3 == 0 && i % 5 ==0){
printf("fizzbuzz %d \n", i);
}
else if (i % 3 == 0){
printf("fizz %d \n", i);
}
else if(i % 5 == 0){
printf("buzz %d \n", i);
}
}
// Return value.
return Py_BuildValue("i", 0);
}
// Mapping between python and c function names.
static PyMethodDef fizzbuzzModule_methods[] = {
{"fizzbuzz", py_fizzbuzz, METH_VARARGS},
{NULL, NULL}
};
// Module initialisation routine.
void init_fizzbuzz(void)
{
// Init module.
(void) Py_InitModule("fizzbuzz", fizzbuzzModule_methods);
}
−1import _fizzbuzzErträgedynamic module not initialised properly Wenninitfizzbuzzwird mit korrigiertinit_fizzbuzz.
– Benutzer2284570
31. Juli 2016 um 21:51 Uhr
Kar
Wenn Sie Python 3 verwenden, müssen Sie die folgenden Änderungen an Ihrem Code vornehmen:
static struct PyModuleDef fizzbuzzModuleDef =
{
PyModuleDef_HEAD_INIT,
"fizzbuzz", /* name of module */
"", /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
fizzbuzzModule_methods
};
PyMODINIT_FUNC PyInit_exmod(void) {
return PyModule_Create(&fizzbuzzModuleDef);
}
−1import _fizzbuzzErträgedynamic module not initialised properly Wenninitfizzbuzzwird mit korrigiertinit_fizzbuzz.
– Benutzer2284570
31. Juli 2016 um 21:51 Uhr
14043900cookie-checkImportError: dynamisches Modul definiert keine Init-Funktion (initfizzbuzz)yes
Das ist noch lange kein passendes Python-Erweiterungsmodul.
– Martijn Pieters
♦
15. Juni 2014 um 2:18 Uhr
Ich schlage vor, Sie lesen zuerst die C-API-Tutorial.
– Martijn Pieters
♦
15. Juni 2014 um 2:20 Uhr
Für die Nachwelt, wenn Sie zwei Dateien haben
fizzbuzz.so
und ein (richtig geschriebener ctypes-Wrapper)fizzbuzz.py
im selben Verzeichnis, und Sie versuchen esimport fizzbuzz
Python scheint das zu bevorzugen.so
was ebenfalls diese Fehlermeldung erzeugt.– Cuade
23. September 2015 um 20:30 Uhr
C-Erweiterungen von Python 2 auf 3 portieren: docs.python.org/3/howto/cporting.html
– benjimin
14. Juni 2019 um 0:13 Uhr