Frage

Hallo, ich weiß, wie man Bibliothek (DLL) in Windows mit Visual Studio 2012 mit C ++ und importiert in Python mit CTypes funktioniert großartig

hier kleines Beispiel

lib.cpp

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a,int b)
{
return (a+b);
}

lib.h

int sum(int,int); 

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)

Ich versuchen

__declspec attribute 'dllexport' is not supported

Und wenn ich lib.dylib in Python importiere, bekomme ich Fehler

AttributeError: dlsym(0x101afba30, sum): symbol not found

Was ich falsch mache ? Kann jemand einen einfachen Code schreiben, wie ich mit XCode einen Dylib im Mac erstellen kann, um mit CTypes in Python 2.6.4 zu importieren

ODER

Das ist ein besserer Weg, um Libies in Python in beiden Systemen für Mac und Win zu importieren?

Basic Ich schreibe gerne Code in Windows mit Visual Studio 2012 Machen Sie DLL I und dann einfachen Compiler im Mac mit Xcode und importieren Sie in Python

War es hilfreich?

Lösung

Ihr Problem war, dass Sie bereits die Dylib in Ihren Python -Dolmetscher geladen hatten. Nur wieder aufbauen, wirkt sich das nicht aus, was Sie in den Speicher haben.

Nur noch einen machen LoadLibrary kann die Bibliothek neu laden oder nicht, und es gibt keine Möglichkeit, sie dazu zu zwingen.

Es gibt auch keine Möglichkeit, Bibliotheken zu entladen und neu zu laden ctypes. Der Hauptgrund ist, dass es auf allen Plattformen keinen sicheren Weg gibt - in der Tat vor 10.4, OS X selbst war eine solche Plattform. (Und Python hat immer noch Aktueller Quellcode im Baum Unterstützung vor dem 10.4 OS X in ctypes.) Aber auch zu versuchen, ein Modell zu entwickeln, das die Dinge auf jeder Plattform auf jeden Fall macht, ist nicht gerade trivial. So, ctypes Versucht es nicht.

Wenn Sie es wirklich tun müssen, die _ctypes Modul darunter ctypes Im Allgemeinen exportiert die erforderlichen Funktionen in Python. Wenn Sie die Namen für Ihre Plattform kennen, können Sie sie mit finden help(_ctypes), oder durch Blick die Quelle.

Kurz gesagt, auf den meisten modernen POSIX -Plattformen (einschließlich OS X 10.5+) ist es _ctypes.dlclose(mydll._handle), während bei Win32, ist es _ctypes.FreeLibrary(mydll._handle). In beiden Fällen, wenn Sie jemals verwenden mydll Auch hier sollten Sie für einen Segfault beten (oder alle Funktionen oder Werte, auf die Sie sich darauf beziehen). Sie können auch beim Beenden Segfault. Und unter Windows kann es die Bibliothek möglicherweise nicht kostenlos frei haben, wenn Sie sie bitten, und in einigen Fällen müssen Sie die Bibliothek fragen, ob sie bereit ist zu entladen das FreeLibrary Dokumente über MSDN und natürlich die Manpage für dlclose(3) Bei jedem POSIX -System, das Ihnen wichtig ist.

Im Allgemeinen ist es eine viel bessere Idee, stattdessen einen neuen Interpreter -Prozess zu starten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top