einbinden vom c und c++

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Sonntag 6. April 2008, 11:41

Falls es nötig ist, dass ein kritisches Stück Code besonders schnell ausgeführt wird, oder wenn Sie möchten, dass einige Algorithmen nicht offen lesbar sind, können Sie solche Teile Ihres Programms in C oder C++ schreiben und dann diese in Ihrem Python-Programm verwenden.
ich höre in der pythonbeschreibung immer dieses obige schlagwort, so als wär es immer ein kinderspiel eben mal schnell eine routine einzubauen die evtl in python zu langsam ist.

habe aber noch nichts gefunden als einfache demo für die c-einbindung.

kann dazu mal ein fachman hier eine kurze begreifbare beschreibung geben.

danke.

mfg
Zuletzt geändert von sechsrad am Sonntag 6. April 2008, 15:43, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonntag 6. April 2008, 11:47

Hm ... willst Du das wirklich für Dich wissen? Ich kenne jetzt ja Deine Kenntnisse in C / C++ nicht, aber Deine Python-Kenntnisse sind ja noch nicht so überragend. Imho ist dieser Ansatz für Dich im Moment noch nicht wirklich geeignet. Dazu muss man schon sehr genau wissen, an welcher Stelle man Geschwindigkeit herausholen kann!

Naja, hast Du denn mal hier im Board gesucht?
http://www.python-forum.de/topic-7814.html

Hab ich mal auf die Schnelle rausgepickt! Evtl. hilft Dir das ja schon.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 6. April 2008, 12:05

oder wenn Sie möchten, dass einige Algorithmen nicht offen lesbar sind
Wunschdenken...reverse engineering funktioniert recht gut -> Das klappt also nicht.
Davon kannst du also gleich ablassen.
Und bis du an die Stelle kommst, wo die Funktionen in C auslagern musst...dauert es noch ne Weile. Python ist um Größen schneller als man denkt.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Sonntag 6. April 2008, 16:54

hallo, habe mingw-5.1.3 auf windows installiert, geht jetzt alles automatisch.

habe diese kleine demo erstellt:
// Das C-Programm
int mult(int n) {
return n*n;
}
habe dann diese dll erstellt :
gcc -c test.c
gcc -shared test.o -o test.dll
und dieses py-programm:

Code: Alles auswählen

#!/usr/bin/env python
import ctypes
f = ctypes.cdll.LoadLibrary("test.dll")
print f.mult(5)
und es hat geklappt. klasse.

danke für diese hilfe.

mfg
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Sonntag 6. April 2008, 17:11

Hallo,

ich will ja jetzt nicht gross rumposaunen, da vieles schon erwähnt wurde, aber es wäre für Dich wirklich von Vorteil, wenn Du einfach mal bei den Basics beginnst.

Ich programmiere selber in Hochsprachen und seit ich Python vor kurzem für mich entdeckt habe, gehe ich, so blöd es mir auch erscheinen mag, alle Grundlegenden Dinge von Anfang an durch und baue mir so alles auf.

Es macht nicht viel Sinn, irgendwelche C-Programme und DLLs zu erstellen und diese in Python einzubinden, ohne sich mit den Voraussetzungen beschäftigt zu haben, die Python bietet und wie schon jemand hier geschrieben hatte: Bis Du dahin kommst, Python-Code in C auszulagern, weil Python zu langsam ist, ist es ein langer Weg.

Mach doch erstmal einige Basics durch, lern den interaktiven Modus kennen, schreib ein paar einfache Skripte oder Programme und dann steigere Dich zu OOP und den Mitteln, die Python da bereit hält.

Irgendwelchen Code hier zu kopieren und darin rumzufummeln bringt Dich nicht weiter, schon garnicht in der Anfangsphase mit Python.

Ein Bekannter meinte, so auch Perl zu lernen, indem er ständig nur fertige Skripte kopierte und diese seinen Gegebenheiten anpasste und daraus resultierte dann so ziemlich das schlechteste in perl programmierte Forum, dass ich jemals gesehen habe.


Das nur als Tip.

ne0h
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Sonntag 6. April 2008, 17:24

ich habe mein projekt für mein roboter in python fertig erstellt.
meine auswerterteroutine habe ich schon lange in c erstellt und mit dev-c++ getestet. für diese komplexen berechnungen ist python nicht schnell genug weil die berechnungen zu umfangreich sind.

es klappt jetzt.

mfg
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 6. April 2008, 17:35

ne0h hat geschrieben:Ein Bekannter meinte, so auch Perl zu lernen, indem er ständig nur fertige Skripte kopierte und diese seinen Gegebenheiten anpasste und daraus resultierte dann so ziemlich das schlechteste in perl programmierte Forum, dass ich jemals gesehen habe.
Ach, das ist in PHP auch gängige Routine, habe ich vor Jahren auch mal so gemacht. phpBB 2.0 ist scheinbar auch auf diese Art und Weise entstanden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 6. April 2008, 17:36

Zeig mal bitte die Berechnungen in Python...da muss irgendwas nicht stimmen :D

Im reinen Rechnen ist Python in der Regel nicht langsamer als C, hab ich oft genug gesehen ;)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Sonntag 6. April 2008, 18:38

audax hat geschrieben:Im reinen Rechnen ist Python in der Regel nicht langsamer als C, hab ich oft genug gesehen ;)
Gerade beim reinen Rechnen ist C um einiges schneller.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 6. April 2008, 18:50

Und gerade dort wirkt Psyco wahre Wunder. Ist ja nicht so, als hätte ich das noch nicht ausprobiert ;)

€dit:
Wobei...wenns auf nem Roboter ist, hat man es wahscheinlich nicht mit nem x86 zu tun. Und trotzdem: Nur wirklich selten sind ordentliche Rechungen ein Flaschenhals.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Sonntag 6. April 2008, 19:38

ich habe mein projekt für mein roboter in python fertig erstellt.
meine auswerterteroutine habe ich schon lange in c erstellt und mit dev-c++ getestet. für diese komplexen berechnungen ist python nicht schnell genug weil die berechnungen zu umfangreich sind.

Hallo,

tut mir Leid wenn ich nochmal hier einschneide, aber irgendwie wirkt das auf mich ziemlich.... kurios.

Ich meine, Du schreibst hier ins Forum und stellst Fragen zu Tkinter und allgemeiner OOP (was ja auch gut ist, nicht falsch verstehen) aber auf der anderen Seite hast Du ein Roboterprojekt in Python geschrieben mit Auswertungsroutinen in C ? :?

Mal ganz davon abgesehen, dass Python in Sachen Berechnungen, gerade mit "NumPy", nicht so schnell an seine Grenzen stoßen dürfte.

Hinzu kommt, dass Du auf Antworten der User hier im Grunde garnicht eingehst. Es ist ja nicht nötig, dass man stundenlang diskutiert und ein Thema völlig in Grund und Boden redet, aber wenn Du hier Fragen stellst und Dir wird von mehreren Usern ausführlich geantwortet, dann reagierst Du (wie hier zum wiederholten Male) damit, dass Du von Deinem in Dev-C++ entwickelten Roboterprojekt erzählst (was nun auch völlig Schnurz-Piep egal ist, obs in Dev-C++, in MS VS 2005, Free C++ oder mit nem Editor erstellt wurde) und dazwischen streust Du mal eine neue Frage ein zu irgendwelchem Programmcode anderer Leute, den Du Dir einfach kopierst und darin rumwerkelst.

Wenn Du wirklich daran interessiert bist, Python zu lernen, dann schlag doch den schwereren Weg ein und beginne, wie schon mehrfach angesprochen, bei den Grundlagen. Das tue ich auch und man lernt ständig etwas neues dazu.

Aber ich bin ganz ehrlich: Ich glaube Dir einfach kein Wort, dass Du Programme zur Robotersteuerung in Python schreibst mit irgendwelchen Routinen in C und gleichzeitig fragst Du in einem anderen Thread, wie man C/C++ Code in Python einbindet.

Ein Programm zur Robotersteuerung ist kein Kinderklacks und an solchen Sachen schreiben diverse Entwickler Jahrelang bis zur fertigen Version.

Na ja, musst Du wissen, wie Du dammit hier auftreten willst.

Aber ich persönlich finde es deutlich angenehmer, wenn jemand lieber 10 Mal eine blöde Frage stellt und sich damit wenigstens um Verständnis bemüht bzw. sich überhaupt etwas Mühe macht statt mit angeblichen Projekten um sich zu schmeissen, Fragen zu stellen und auf Antworten nicht zu reagieren und sich einfach unglaubwürdig zu präsentieren.


MfG

ne0h
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Sonntag 6. April 2008, 19:53

Ach ja:

P.S.

Wenn man sich mal die Referenzen ansieht, in welchen Bereichen Python eingesetzt wird, dann wär es viell. gut, wenn Du Dein ganzes Projekt einfach mal in Assembler schreibst. Schliesslich hast Du Python ja schon an seine Leistungsgrenzen gebracht, da wird Dich der Geschwindigkeitsvorteil von Assemblercode sicher aus dem Hocker hauen. :wink:


ne0h
lunar

Sonntag 6. April 2008, 22:41

audax hat geschrieben:
oder wenn Sie möchten, dass einige Algorithmen nicht offen lesbar sind
Wunschdenken...reverse engineering funktioniert recht gut -> Das klappt also nicht.
Recht gut ist übertrieben. Rückübersetzung klappt heute eigentlich gar nicht mehr, denn alles jenseits von Disassemblierung ist angesichts der weitreichenden Optimierungen moderner Compiler pure Spekulation. Der alternative Weg über Debugging lässt sich auch ganz gut blockieren, wie uns Skype recht erfolgreich demonstriert.

Im Übrigen hat Reverse Engineering schon bei RC4 nicht "recht gut" funktioniert ;)
Und bis du an die Stelle kommst, wo die Funktionen in C auslagern musst...dauert es noch ne Weile. Python ist um Größen schneller als man denkt.
Allerdings auch um Größen langsamer als C. Sicherlich ist der OP noch weit davon entfernt, sich über darüber Gedanken zu machen, aber schön reden sollte man die Performance von Python auch nicht ;)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 7. April 2008, 01:44

lunar hat geschrieben:
audax hat geschrieben:
oder wenn Sie möchten, dass einige Algorithmen nicht offen lesbar sind
Wunschdenken...reverse engineering funktioniert recht gut -> Das klappt also nicht.
Recht gut ist übertrieben. Rückübersetzung klappt heute eigentlich gar nicht mehr, denn alles jenseits von Disassemblierung ist angesichts der weitreichenden Optimierungen moderner Compiler pure Spekulation. Der alternative Weg über Debugging lässt sich auch ganz gut blockieren, wie uns Skype recht erfolgreich demonstriert.

Im Übrigen hat Reverse Engineering schon bei RC4 nicht "recht gut" funktioniert ;)
Wenn es allerdings um kurze ausgelagerte Codestücke geht, wie sie der OP gerne nutzen würde, ist das durchaus im Rahmen des Möglichen.
Secrurity by Obscurity ist jedenfalls nichts, worauf man sich verlassen sollte.

Aber gut, ich gebs zu: 'recht gut' war übertrieben ;)
BlackJack

Montag 7. April 2008, 07:05

Die Frage ist immer was man beim "reverse engineering" bezweckt. Es stimmt, dass man nicht den originalen Quelltext heraus bekommt, aber in der Regel will man ja nur den Algorithmus rekonstruieren oder beim "cracken" gar nur eine ganz begrenzte Stelle ändern. Und das funktioniert normalerweise, wie die vielen Cracks und Keygeneratoren für alle möglichen geschützten Programme zeigen.
Antworten