C-Programme in Python einbinden

Code-Stücke können hier veröffentlicht werden.
BlackJack

``PASCAL``!? Das ``FAR`` könnte ich ja noch verstehen wenn der OpenWatcom sonst 16-Bit-Code generiert, aber der Unterschied zwischen Aufrufen in Pascal und C ist doch die Reihenfolge in der die Argumente auf dem Stack abgelegt werden und wer für's Aufräumen des Stacks zuständig ist. Und da dachte ich das DLLs der C-Konvention folgen!?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das FAR kann man wirklich bei der 32-Bit-Code-Voreinstellung weglassen. Wenn ich aber statt PASCAL gar nichts oder CDECL angebe, wird die Funktion fib unter dem Namen fib_ oder _fib exportiert, was natürlich unschön ist. Wenn ich PASCAL angebe, muss ich entsprechend in ctypes auch WinDLL verwenden.
MfG
HWK
BlackJack

Wo kommt der Unterstrich denn her? Und warum? Kann das am ``__extern`` liegen? Was macht das denn? Normalerweise wird bei C doch jede Funktion die nicht ``static`` deklariert wurde auch automatisch unter ihrem Namen wie er im Quelltext steht in der object-Datei verfügbar gemacht. So kenne ich das jedenfalls von allen C-Compilern mit denen ich bis jetzt zu tun hatte.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Weiss ich auch nicht genau. Auf jeden Fall sind __export (nicht __extern) oder __declspec(dllexport) notwendig, damit etwas aus der DLL exportiert wird. Dies ist auch bei Visual-C der Fall. Möglicherweise sind es C-Konventionen unter Windows, dass eine exportierte Funktion mit einem Unterstrich beginnt oder endet, denn bei PASCAL passiert dies ja nicht. Deshalb sollte es am __export nicht liegen.
MfG
HWK
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

HWK hat geschrieben:Weiss ich auch nicht genau. Auf jeden Fall sind __export (nicht __extern) oder __declspec(dllexport) notwendig, damit etwas aus der DLL exportiert wird. Dies ist auch bei Visual-C der Fall. [...]
Full ack! Nicht nur bei VC sondern auch mit gcc unter Windows. Wie das unter Linux aussieht weiß ich auch nicht.
gfmwm
User
Beiträge: 8
Registriert: Samstag 26. September 2009, 18:35

Ich grabe nur ungern Leichen aus, aber ich habe ein Problem mit ctypes.

Ich nutze Python 3.1 unter Win7 (64-bit). Ich erstelle folgendes Skript:

Code: Alles auswählen

import ctypes
f = ctypes.cdll.LoadLibrary("fib.dll") 
print(f.fib(35))
Die fib.dll habe ich mit MinGW erstellt. Unter Ubuntu läuft die Sache, nur unter Windows nicht. Ich erhalte immer folgende Fehlermeldung:
Traceback (most recent call last):
File "C:\...\ctypes.py", line 1, in <module>
import ctypes
File "C:\...\ctypes.py", line 2, in <module>
f = ctypes.cdll.LoadLibrary("fib.dll")
AttributeError: 'module' object has no attribute 'cdll'
Habe schon alles Mögliche probiert (z.B. Systempfade angepasst, Python neu installiert, etc.), leider ohne Erfolg.

Wenn ich allerdings im IDLE folgendes eingebe:

Code: Alles auswählen

>>> import ctypes
>>> print(ctypes.cdll)
<ctypes.LibraryLoader object at 0x027BDFB0>
Scheint es zu funktionieren!?!

Hat jemand eine Idee woran es liegen könnte?
[code]print(''.join(map(lambda c:chr(33+((ord(c)-33+47)%94)),[x for x in 'p{{/*~&#/qp$t/p#t/qt{~}v/%~/&$/PPP'])).replace('^',' '))[/code]
BlackJack

@gfmwm: Du hast Dein Skript nicht zufällig `ctypes` genannt!? ;-)
gfmwm
User
Beiträge: 8
Registriert: Samstag 26. September 2009, 18:35

@BlackJack

Doch das habe ich. Aber, wenn ich es als "test123.py" abspeichere, bekomme ich exakt dieselbe Fehlermeldung.
[code]print(''.join(map(lambda c:chr(33+((ord(c)-33+47)%94)),[x for x in 'p{{/*~&#/qp$t/p#t/qt{~}v/%~/&$/PPP'])).replace('^',' '))[/code]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Dann lösche noch die Datei ctypes.pyc ;)
gfmwm
User
Beiträge: 8
Registriert: Samstag 26. September 2009, 18:35

Ok, das hat geklappt. Vielen, vielen Dank.
Hätte nie gedacht, dass es daran liegen könnte. :D
[code]print(''.join(map(lambda c:chr(33+((ord(c)-33+47)%94)),[x for x in 'p{{/*~&#/qp$t/p#t/qt{~}v/%~/&$/PPP'])).replace('^',' '))[/code]
Antworten