C in Python verwenden (Informationssuche)

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Grüße,

meine nächste kleinere bis größere Aufgabe ist C in Python zu verwenden. Laut meinem aktuellem Stand ist es so das der C-Code fertig is, meine Aufgabe wäre jetzt diesen in Python zu integrieren.
Daher suche ich aktuell Informationen wie das ganze funktionieren kann. Ich hab hier im Forum schon etwas gefunden, Cython, nur klang das ganze für mich eher nach einer Hybridsprache und nicht nach einer Möglichkeit C in Python zu implementieren.

Schön wäre Lektüre und vllt gibts noch andere Varianten als Cython.

Danke
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: um compilierte Bibliotheken in Python zu verwenden gibt es ctypes. Ansonsten gibt es je nach Anwendungesfall und Aufwand den Du betreiben willst, die Möglichkeiten ein Framework wie swig zu benutzen oder direkt eine Pythonbibliothek in C zu schreiben, dazu gibt es in der offiziellen Dokumentation ausführliche Anleitungen.
Bei allen Varianten brauchst Du gute bis sehr gute C-Kenntnisse.
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Kalli87: Python selbst ist in C implementiert. Es bietet eine umfangreiche API an, um aus eigenem C-Code ein Python-Modul mit entsprechenden Funktionen machen zu können. Wenn du auf Tools wie Cython verzichten willst, dann wirst du das wohl über diese API machen müssen. Ich sage dir jetzt schon: Das ist aufgrund der Komplexität zeitaufwändig und fehleranfällig, wenn man es zum ersten Mal macht. Ich würde dir diesen Weg eher nicht empfehlen.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Das ganze klingt jetzt nicht sehr ermutigend von euch.
Ich muss auch zugeben in C kenne ich mich nur minimal aus C++ is auch schon ewig her.

Hab mir das ganze wohl zu einfach vorgestellt :?
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Worum geht's dir denn: Schneller machen eines bestimmten Bereichs in deinem Programm? Oder eher das Einbinden bzw Benutzen einer Fremdbibliothek, die in C geschrieben ist?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Soweit ich weiß, dient das was in C geschrieben wurde, um den DICOM-HEADER auszulesen um was auch immer damit anzustellen.
Von schneller machen des eigentliches Codes war keine Rede nur das einbinden von C in Python.
Genaueres kann ich erst am Donnerstag sagen und bis dahin will ich paar Informationen sammeln.
BlackJack

@Kalli87: Was und in welcher Form eingebunden werden soll ist aber nicht unwichtig um sinnvoll zwischen den Alternativen wählen zu können. Wie Sirius3 schon schrieb braucht man in jedem Fall C-Kentnisse, es könnte also hilfreich sein bis die Aufgabe raus ist, sich mit C zu beschäftigen. Man muss sich mindestens mit Datentypen (Grundtypen/Verbundtypen/Pointer), Funktionsaufrufen/Parameterübergabe, und manueller Speicherverwaltung vertraut machen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: es lohnt sich immer, sich erstmal zu schauen, ob es schon was für Python gibt, bevor man selbst was erfindet: http://www.pydicom.org/ bzw. ein ganzes Tutorial dazu.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ich geh Kaputt :shock:
Ich hab selbst danach mal gesucht aber was ich gefunden hatte war Uralt und wurde nicht mehr unterstützt.

Danke!
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Guten Morgen :)
soweit ich jetzt erfahren habe ist das ich in Python eine C-Bibliothek einbinden soll.
Die frage is nur was is einfacher? Eine Bibliothek einbinden oder versuchen mit PyDicom das gleiche zu erreichen?
BlackJack

@Kalli87: Ist nicht eher die Frage ob der Ausbilder(?) nur am Ergebnis interessiert ist oder ob der Weg wichtig ist, also sollst Du lernen Informationen aus so einer Datei zu ziehen oder sollst Du lernen wie man eine C-Bibliothek in Python einbindet?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack: "Ausbilder" trifft es nicht ganz, er ist mein Chef vom Praktikum.
Er gab mir die Aufgabe und ich hab Ihm die möglichen Varianten genannt die möglich wären. Er hat damals in C das auslesen des DICOM-Headers geschrieben und sein eigenes Programm (vermute ich mal) daraus entwickelt. Nun soll diese Funktion in erster Linie in mein Python-Programm eingebunden werden. Wie ich das anstelle, egal ob per PyDicom-Modul oder Cython, is mir überlassen. Ich hab ihm aber auch gesagt das alle Varianten recht komplex sind und viel zeit in Anspruch nehmen würden und auch die Gefahr besteht das ich das nicht auf die Reihe bekomme.

Deswegen war die Frage an euch gerichtet welche Variante am einfachsten wäre.

Cython an sich gut zu sein aber die Entwicklung scheint für mich nicht gerade leicht zu sein.
PyDicom hab ich mir mal näher angeschaut aber so richtig gefällt mir das auch nicht, ich will ja nur den Header auslesen und keine Bilder darstellen.
Swig klang für mich bis jetzt ganz vernünftig da man nicht soviel machen muss, is nur die Frage was nach dem wrappen passiert bzw. wie ich das am Ende verwenden kann.

Ps. Da ich in Weiterbildung bin hab ich keinen direkten Ausbilder sprich im Praktikum versuche ich nur mein Wissen zu vertiefen und wenn ich mal Schule habe wird auf Programmierung nicht soviel Wert gelegt was eigentlich Schwachsinn ist. Wir hatten am Anfang mal mit C++ angefangen aber seit ich im Praktikum bin will ich auch in der Schule mit Python arbeiten aber da steh ich alleine da ^^ weil weder mein Chef noch die Dozenten in der Schule Python können.

Wenn ich das Problem mit dem Dicom-Header irgendwie vernünftig lösen kann wäre ich zufrieden und mein Chef sicher auch da ich mir meinen eigenen Gedanken gemacht und Lösungen gesucht habe.
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:Cython an sich gut zu sein aber die Entwicklung scheint für mich nicht gerade leicht zu sein.
Wo genau liegen deine Probleme? Ich finde Cython eigentlich recht benutzerfreundlich. Natürlich muss man sich, wie überall, erstmal einarbeiten. Aber so schlimm, dass man sich total darin verlieren würde, finde ich Cython jetzt nicht.

Vielleicht hilft für den Anfang ja dieses Tutorial.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: niemand kennt hier die C-Bibliothek, zumal sie ja eine Eigenentwicklung ist. Also kann man auch keine Aussage darüber machen, wie man die am besten in Python einbindet. Wenn sie eine schöne API hat, dann ist ctypes das einfachste, weil es nur aus DLL-Laden und Funktion aufrufen besteht: wenn man sich mit C-Datentypen auskennt, ist das 0 Lernaufwand. Wenn man dagegen mit komplizierten Structs arbeiten muss, kann es einfacher sein, sich direkt aus den Header-Dateien passende Wrapper generieren zu lassen.

EDIT: noch simpler als mit pyDICOM geht's doch gar nicht, die Header zu lesen, laut Dokumentation sind das drei Zeilen:

Code: Alles auswählen

>>> import dicom
>>> plan = dicom.read_file("rtplan.dcm")
>>> plan.PatientName
'Last^First^mid^pre'
Zuletzt geändert von Sirius3 am Donnerstag 23. April 2015, 09:23, insgesamt 1-mal geändert.
BlackJack

@Kalli87: Pydicom ist bereits fertig und reines Python, lässt sich also einfach installieren. Wenn das Modul also die benötigten Anforderungen erfüllt, wäre das wohl der einfachste Weg an die (Meta)Daten in DICOM-Dateien heran zu kommen. Ich verstehe auch den Einwand mit dem anzeigen von Bildern nicht ganz, denn dafür ist Pydicom doch gar nicht gedacht. Zitat aus der ``README.md``: `pydicom is not a DICOM server, and is not primarily about viewing images.` (Hervorhebung von mir).

Es ist aus der Beschreibung der Aufgabe auch immer noch nicht ganz klar was genau eingebunden werden soll. Die ganzen bisher besprochenen Möglichkeiten beziehen sich ja auf C-*Bibliotheken*, also je nach Betriebssystem ``*.DLL``- oder ``*.so``-Dateien zu denen man die Header-Informationen hat. Wenn Du ein in C geschriebenes *Programm* statt einer Bibliothek hast, müsstest Du das ja erst einmal soweit umschreiben das man die Funktionalität überhaupt von einem anderen Programm aus nutzen kann. Also eine Bibliothek daraus machen.

Ich persönlich würde ja immer erst prüfen ob `ctypes` zur Anbindung einer nativen Bibliothek in Frage kommt. Insbesondere unter Windows ist das für Benutzer dann einfacher weil die nur die DLL und die Python-Dateien benötigen und nichts speziell gegen ihre verwendete Python-Version kompiliert werden muss. Und meistens funktioniert so eine Anbindung dann auch mit alternativen Python-Implementierungen (IronPython, Jython, PyPy, …) ohne spezielle Vorkehrungen.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Danke für die ganzen Tipps. :)

Das mit dem Header wurde pausiert gerade, Ich soll erstmal eine Oberfläche für ein Shellscript basteln.
Nur das Script scheint aber Bash zu sein von Linux, da muss ich jetzt erstmal gucken wie das funktionieren soll.

Tipps sind gern gesehen :wink:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Statt ctypes würde ich noch cffi in die Runde werfen. Ich nutze es ganz gerne um C libraries in Python zu testen. Der wesentliche Vorteil gegenüber ctypes ist dass wenn man Python und C kennt ein kurzer Blick über die CFFI Dokumentation alles erklärt was man wissen muss. Die Auseinandersetzung mit der ctypes API und wie diese C Konzepte repräsentiert dauert ja doch eine Weile. Außerdem lassen sich mit CFFI Anbindungen auf API Ebene schreiben, während man mit ctypes an die ABI gebunden ist.

Gerade wenn man neuen C Code schreibt und die Gelegenheit hat die Header so simpel zu halten das CFFI die versteht, bekommt man die Anbindung quasi umsonst.
Antworten