C libs

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Hab im Netz ein kleines profanes Snippet gefunden, wie man einfach die C libs verwendet. http://jabasite.ej.am/blog/2007/10/10/c-and-python/
Ich weiß noch nicht, ob ich das mal brauche und/oder ob es was bringt, aber gut zu wissen, wie es geht. Die Doku fand ich dazu relativ undurchsichtig.

Code: Alles auswählen

import sys
from ctypes import cdll

if sys.platform == "linux2":
    libc = cdll.LoadLibrary("libc.so.6")
elif sys.platform == "win32":
    libc = cdll.msvcrt

libc.printf("%d %d\n",42,4242)
Den Code habe ich mit Windows getestet.
lunar

@hendrikS: Seit Python 2.6 reicht ein einfaches "find_library('c')", um die C-Standardbibliothek zu laden. Unter Windows wird dieser Aufruf entsprechend auf die Microsoft-Standardbibliothek umgeleitet.

Ob man ctypes jetzt verstehen lernt, wenn man "printf" einmal ausführt, sei dahingestellt.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Danke für die Ergänzung hinsichtlich 2.6.
Sicher wird man man ctypes von diesem Beispiel nicht verstehen. Ist nur ein kleines durchgehendes Beispiel wie man die Bibliothek nutzen kann. Die Doku ist hier etwas scattered. Ich denke, man wird schon mal in C programmiert haben müssen, um überhaupt auf die Idee zu kommen, das anzuwenden.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

hmmm...., tolle Sache. Find ich toll was du da ausgegraben hast.
Ich progge mit Windows. Funktioniert auch bei mir.

Wo liegt die Datei : msvcrt?

Kannst du noch mehr ausgraben, damitich dieses mit dem "ctypes mal verstehe?

Kann man jetzt zb auch schnelle c-for-schleifen damit realisieren? um mal etwas grösseres auszuwerten. Ich denke an einem grossen bytearry von einem Bild zum beispiel.

Wird der Code eigentlich in der Geschwindigkeit von "c" umgesetzt? oder bleibt es bei der Pythoninterpretergeschwindigkeit?

Gruss
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

funkheld hat geschrieben:Wo liegt die Datei : msvcrt?
Der eigentliche Heimatordner sollte c:\windows\system sein. Ist aber gut möglich, daß Du Kopien der dll in verschiedenen anderen Applikationsordnern findest.
funkheld hat geschrieben:Kannst du noch mehr ausgraben, damitich dieses mit dem "ctypes mal verstehe?
Die Doku ist recht umfangreich dazu. Einfach mal n'bißchen durchblättern. Prorammierpraxis in C ist auf jeden Fall von Vorteil. Ich denke der Hauptanwendungsfall liegt im Zugriff auf Funktionen von externen Bibliotheken.
funkheld hat geschrieben:Kann man jetzt zb auch schnelle c-for-schleifen damit realisieren? um mal etwas grösseres auszuwerten. Ich denke an einem grossen bytearry von einem Bild zum beispiel.
For Schleifen im herkömmlichen C-Stile sind nicht möglich.
funkheld hat geschrieben:Wird der Code eigentlich in der Geschwindigkeit von "c" umgesetzt? oder bleibt es bei der Pythoninterpretergeschwindigkeit?
Die Frage nach der Geschwindigkeit habe ich mir auch gestellt. Ein einfaches puts statt print hat zumindest erstmal nichts gebracht.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

funkheld hat geschrieben:Kannst du noch mehr ausgraben, damitich dieses mit dem "ctypes mal verstehe?
ctypes stellt einfach nur eine Schnittstelle zur Verfügung über die man Funktionen aus c-Bibliotheken aufrufen kann. Davon wird Python nicht automatisch schneller. Eine Beispielanwendung ist zum Beispiel einen Thread unter diesem diesem zu finden, in dem ich die libtiff verwende (brauchst nur die Klasse TIFFImageInput zu beachten).
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

hendrikS hat geschrieben:
funkheld hat geschrieben:Wird der Code eigentlich in der Geschwindigkeit von "c" umgesetzt? oder bleibt es bei der Pythoninterpretergeschwindigkeit?
Die Frage nach der Geschwindigkeit habe ich mir auch gestellt. Ein einfaches puts statt print hat zumindest erstmal nichts gebracht.
Natürlich wird die eigentliche Funktion in "C-Geschwindigkeit" ausgeführt. ctypes popelt nicht am Maschinencode der Funktion rum. Zeitkritisch dürfte für kleine C-Funktionen eher das "Dekorieren" der Funktion seitens ctypes sein - Pythontypen in C-Typen wandeln, stack frame vorbereiten, C-Funktion aufrufen, Rückgabe in Pythontyp wandeln. Wahrscheinlich gibt es für Funktionen einen break even point, ab dem sich ctypes erst lohnt. Für kleinere Sachen wie ein einfaches printf() kommt Pythons 'print' vermutlich mit weniger Zyklen zum Ziel.
funkheld hat geschrieben:Kann man jetzt zb auch schnelle c-for-schleifen damit realisieren? um mal etwas grösseres auszuwerten. Ich denke an einem grossen bytearry von einem Bild zum beispiel.
Ja. Die Antwort findest Du in dem C-Schnipsel, welches ich Dir in einem anderen Thread geschrieben habe. Die Funktion nimmt dort ein char-Array entgegen und iteriert mit einer "schnellen C-for-Schleife" darüber (wobei man das printf() nicht so machen würde, mir ging es damals darum Dir zu zeigen, wie man an die einzelnen Bytes kommt).
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

jerch hat geschrieben:Ja. Die Antwort findest Du in dem C-Schnipsel, welches ich Dir in einem anderen Thread geschrieben habe. Die Funktion nimmt dort ein char-Array entgegen und iteriert mit einer "schnellen C-for-Schleife" darüber .
Interessant. Kannst Du mal bitte verlinken. Danke.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Finde den Thread gerade nicht, allerdings ist die Sache doch recht trivial:

- erstelle char-Array (in Python u.a. mit ctypes.create_string_buffer())
- übergib char-Array an C-Funktion (z.B. Pointer auf erstes Element + Länge)
- Zugriff in C-Funktion auf i-tes Element des char-Arrays: *(Pointer + i) für 0 <= i < Länge

(Das geht natürlich ebenso mit anderen Array-Typen. Dort musst Du halt den Pointertypen beachten.)

Bin mir nicht sicher, ob es das ist, was Du suchst.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

jerch hat geschrieben:Bin mir nicht sicher, ob es das ist, was Du suchst.
Scheint als hättest Du funkhelds Frage anders verstanden als ich. Ich war nur neugierig geworden, weil Du seine Frage so unmißverständlich mit ja beantwortet hast. Ich hatte die Frage so verstanden, als ob er im Python code C for loops verwenden wollte.
Daß, was Du beschreibst würde ich nur im absoluten Ausnahmefall so machen. Zu aufwendig.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@hendrikS:
Du meinst als eine Art Schleifenersatz in Python C-Code verwenden? C-Python ist doch schon in C :roll:

Ich hatte vor dem Antworten kurz überlegt, ob er

Code: Alles auswählen

for i in binary_data:
    ctypes.c_function_xy(i)

# oder

ctypes.c_function_xy_mit_schleife(binary_data)
gemeint haben könnte. Da er aber von C-Schleifen sprach, war ich von Letzterem ausgegangen. Auf die Idee, das er die for-Anweisung ersetzen möchte, bin ich gar nicht erst gekommen und es erscheint mir auch ziemlich abwegig. Für eine schnellere Pythonlib mit quasi der Einfachheit der Pythonsyntax gibts ja auch noch Cython.

Oder hab ich Dich jetzt falsch verstanden?

Vllt. bringt funkheld etwas Licht ins Dunkel, meine Glaskugel ist im Orakelstreik.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Na, ich las daraus : Wenn schon "c", dann richtig "c" mit power.

Gruss
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@funkheld:

Der Hinweis wurde ja schon gegeben: Für das, was du erreichen willst - nämlich C-ähnliche Ausführungsgeschwindigkeit gekoppelt mit einfacher Python-ähnlicher Syntax -, ist Cython eigentlich optimal. Schau es dir mal näher an, falls noch nicht geschehen.

`ctypes` hingegen ist IMHO eher dann geeignet, wenn es um die reinen Funktionsaufrufe geht, z.B. weil die Bibliothek bisher einfach noch nicht nach Python portiert wurde. Meist geht es dann nicht um Geschwindigkeit, sondern um das reine Ergebnis / die Funktionalität. Insbesondere ist zu beachten, dass `ctypes` über Symbole Funktionen in zur Laufzeit gelinkten Bibliotheken benutzt, während Cython den "klassischen" Weg über den Quelltext geht. Python-Module, die `ctypes` zum Wrappen benutzen, setzen also keine "Entwicklungsversionen" (in der Linux-Welt die Pakete mit der Endung `-dev`) der benötigten Bibliotheken voraus und müssen nicht kompiliert werden. Letzteres wird dir sicher nicht neu sein.
Antworten