C-Programme in Python einbinden

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

Sonntag 26. November 2006, 17:03

``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

Sonntag 26. November 2006, 19:17

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

Sonntag 26. November 2006, 19:57

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

Sonntag 26. November 2006, 20:25

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

Sonntag 26. November 2006, 20:28

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

Freitag 19. März 2010, 22:20

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

Freitag 19. März 2010, 23:08

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

Freitag 19. März 2010, 23:45

@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

Freitag 19. März 2010, 23:54

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

Samstag 20. März 2010, 12:37

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