7 Stimmen

(Swig nach Python) import error:dynamic module does not define init function

Ich versuche, meinen C++-Code mit Swig nach Python zu portieren.

Wenn ich die py-, pyd-, cxx- und lib-Dateien fertiggestellt habe, gebe ich unter Python (Kommandozeile) "module Dnld" ein und es erscheint-> Importfehler: Dynamisches Modul definiert keine init-Funktion . Der folgende Code ist mein Code,

Weiter: Meinen Arbeitsschritt hinzufügen, um Missverständnisse zu vermeiden, danke Mark Tolonen

  1. Datei->Neu->Projekt->Windows-Konsolenanwendung-> DLL und leeres Projekt auswählen (kein Unicode)
  2. Fügen Sie meinen SerialComm-Ordner zum Projekt hinzu (schließen Sie DownloaderEngine.h Serial.h PortEnumerator.h, etc. ein).
  3. Konfigurationseigenschaften->c/c++->Zusätzliche Include-Verzeichnisse-> C:\Python27\include
  4. Konfigurationseigenschaften->Linker->Allgemein->Ausgabedatei->$(OutDir) \Dnld.pyd
  5. Konfigurationseigenschaften->Linker->Eingabe->Zusätzliche Include-Verzeichnisse-> C:\Python27 \libs\python27.lib und . \SerialComm\setupapi.lib
  6. Dnld.i hinzufügen, benutzerdefinierten Aufbau durchführen
  7. Dnld.i Eigenschaftsseite->Befehlszeile->swig -c++ -python $(InputPath)
  8. Dnld.i Eigenschaft page->Output->$(InputName)_warp.cpp
  9. bauen, erstellen Dnld_wrap.cxx, Dnld.py
  10. Dnld_wrap.cxx in mein Projekt einfügen, alles neu erstellen, Dnld.pyd erstellen, das war's

(Umgebung: XP SP3 mit VC2008)

//DownloaderEngine.h
class __declspec(dllexport) CDownloaderEngine
{
public:
    CDownloaderEngine();

    virtual ~CDownloaderEngine();

    signed char OpenPort(signed char _ucPort, unsigned long _ulBaudRate, unsigned char _ucParity,
        unsigned char _ucStopBits,unsigned char _ucData);

    ....
};

//DownloaderEngine.cpp
CDownloaderEngine::CDownloaderEngine()
{
    ....
}

CDownloaderEngine::~CDownloaderEngine()
{
    ....
}

//DownloaderEngine.i
 %module Dnld

 %include <windows.i>
 %include <std_vector.i>
 %include <std_map.i>
 %{
    #define SWIG_FILE_WITH_INIT
    #include ".\SerialComm\DownloaderEngine.h"
 %}

 /* Parse the header file to generate wrappers */
 %include ".\SerialComm\DownloaderEngine.h"

1voto

Joachim W Punkte 6068

Für das Protokoll, hier eine weitere mögliche Ursache für die Fehlermeldung

ImportError: dynamic module does not define init function (init<mylibrary>):

Ausführung von Python2, während Swig für Python3 eingerichtet wurde, oder umgekehrt.

0voto

Perkins Punkte 2209

Ich habe eine Weile gebraucht, um dies herauszufinden. Von den python.org Mailinglisten aquí Es scheint, dass das Problem darin besteht, dass Python erwartet, dass das Modul Foo eine Funktion initFoo bereitstellt. Die Frage ist dann, warum Dnld nicht initDnld bereitstellt. Da swig das meiste davon erledigen sollte, liegt es wahrscheinlich daran, dass swig nicht erwartet, dass die fertige Bibliothek Dnld heißt (wenn es dnld oder D_nld oder irgendetwas anderes erwartet, wird es fehlschlagen, aber das Umbenennen der Datei behebt das Problem). Beachten Sie, dass dies für jede C-Erweiterung für Python gilt, einschließlich derer, die von pyrex/cython und boost erzeugt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X