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
C in Python verwenden (Informationssuche)
@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.
Bei allen Varianten brauchst Du gute bis sehr gute C-Kenntnisse.
@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.
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.
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.
@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.
@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: 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?
@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.
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.
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.Kalli87 hat geschrieben:Cython an sich gut zu sein aber die Entwicklung scheint für mich nicht gerade leicht zu sein.
Vielleicht hilft für den Anfang ja dieses Tutorial.
@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:
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.
@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.
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.
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
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
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.
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.