Seite 1 von 1

C libs

Verfasst: Sonntag 21. November 2010, 17:56
von hendrikS
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.

Re: C libs

Verfasst: Sonntag 21. November 2010, 18:19
von 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.

Re: C libs

Verfasst: Sonntag 21. November 2010, 18:33
von hendrikS
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.

Re: C libs

Verfasst: Sonntag 21. November 2010, 23:51
von funkheld
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

Re: C libs

Verfasst: Montag 22. November 2010, 07:18
von hendrikS
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.

Re: C libs

Verfasst: Montag 22. November 2010, 19:31
von Darii
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).

Re: C libs

Verfasst: Dienstag 23. November 2010, 15:39
von jerch
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).

Re: C libs

Verfasst: Dienstag 23. November 2010, 16:33
von hendrikS
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.

Re: C libs

Verfasst: Dienstag 23. November 2010, 17:05
von jerch
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.

Re: C libs

Verfasst: Mittwoch 24. November 2010, 00:07
von hendrikS
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.

Re: C libs

Verfasst: Mittwoch 24. November 2010, 01:17
von jerch
@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.

Re: C libs

Verfasst: Montag 29. November 2010, 13:21
von funkheld
Na, ich las daraus : Wenn schon "c", dann richtig "c" mit power.

Gruss

Re: C libs

Verfasst: Montag 29. November 2010, 15:54
von snafu
@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.