ImportError: dynamisches Modul definiert keine Init-Funktion (initfizzbuzz)

Lesezeit: 5 Minuten

Benutzeravatar von SamuraiT
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);
        }
    }
}

setup.py

from distutils.core import setup, Extension
module = Extension('fizzbuzz', ['fizzbuzz.c'])
setup(
      name="fizzbuzz",
      version='1.0',
      ext_modules=[module],
)

  • 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 es import fizzbuzzPython scheint das zu bevorzugen .sowas 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

Benutzeravatar des Philosophen
Philosoph

Der Fehler tritt auch bei der Verwendung auf boost::python, wenn sich der Modulname vom kompilierten .so-Dateinamen unterscheidet. Zum Beispiel:

hallo.cpp

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace std;
using namespace boost::python;

int helloWorld(){
    cout << "Hello world!" << endl;
    return 0;
}

BOOST_PYTHON_MODULE(libhello) {
    def("hello_world", helloWorld);
}

Kompilierungsbefehl:

g++ -fpic -shared -o libfoo.so -Wl,-soname,"libfoo.so" hello.cpp -I<path/to/python> -L/usr/local/lib  -lboost_python-py34

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

Benutzeravatar von Martijn Pieters
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.

Ich fordere Sie dringend auf, dem zu folgen Erweitern und Einbetten des Python-Interpreter-Tutorials. Es bringt dir alles bei, was du wissen musst, um deine zu machen fizzbuzz C-Code funktioniert als Python-Modul.

tun python3 ./yourpythonscript

Anstatt von

python ./deinpythonscript

auch wenn Sie Python als Alias ​​python3 haben

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

Benutzeravatar von lackadaisical
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


Benutzeravatar von kar
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


1404390cookie-checkImportError: dynamisches Modul definiert keine Init-Funktion (initfizzbuzz)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy