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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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

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

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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

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

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

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

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

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

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

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.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

ne0h, ich beschäftige mich schon seit längerer zeit mit roboter.
du kennst das hobby nicht. vielleicht hast du auch nicht da geld dazu.
da kommen leicht mit den bauteilen ca 600 euro zusammen.

http://www.roboternetz.de/phpBB2/album_ ... ic_id=2060

hier habe ich ein atmegaboard am pc.
am pc habe ich einen visuellen roboter laufen zur zeit mit gfabasic.
der visuelle roboter arbeitet mit einem visual-ultrasensor als abstandsmesser zu hindernissen. was der visuelle roboter auf dem bildschirm macht ist nur daten vom atmegaboard entgegen zunehmen über die serielle schnittstelle(klappt auch schon mit python)und dann zu fahren (rechts,links,vorwärts,zurück). er sendet dann die visuellen daten(hindernisse die ich auf dem bildschirm gebaut habe) zum atmegabaord zum auswerten. und nur das atmegabord ist verantwortlich das der visuelle roboter die hindernisse umfahren tut.
das board speichert auch daten auf eine sd-karte.

http://www.roboternetz.de/phpBB2/album_ ... ic_id=1994

das hier ist mein bestes stück mit ca 8 sensoren, gameboycam für bilder, compass , seriell- funk usw., habe eine weitere funkcam die nicht drauf ist.
auch datenspeicherung auf der sd-karte funktinoniert auf dem robby.
diesen roboter kann ich schnell umrüsten auf kettenantrieb oder auf räder.
beide haben ihre eigenarten für einen roboter, jen achdem, wo er eingesetzt wird.
und dieses auswerten der funkbilder ist was noch nicht so einwandfrei läuft auf dem pc.

ich möchte mit einem art interpreter arbeiten und aber gleichzeitig für bestimmte funktionen bilder auswerten mit einer schnellen auswerteroutine.

und das ist mein hobby.

habe auch noch ein board mit propeller-parallax-chip. dieses liegt aber noch zur zeit rum.

also nicht nur daddeln mit python, dieses hobby ist etwas mehr.

und für dieses hobby suche ich immer noch eine brauchbare entwicklungsumgebung, was nicht einfach ist.
ob python mit thinker oder wxpython oder evtl nur python .

pygame ist ein anderer zeitvertreib :
ich habe 2x gp2x , einmal den gp2xf200 und den gp2xf100

als pensionär habe ich viel zeit .
Zuletzt geändert von sechsrad am Montag 7. April 2008, 10:17, insgesamt 13-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo sechsrad!

Wenn und falls und wenn wirklich und nur dann -- also wenn Python wirklich mal, nach Optimierung der Algorithmen, zu langsam sein sollte:

In dieser Reihenfolge:

- http://psyco.sourceforge.net/
- http://numpy.scipy.org/
- http://www.cython.org/ bzw. http://www.cosc.canterbury.ac.nz/greg.e ... hon/Pyrex/
- C

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

mit was kann man eigentlich die python-float mundgerecht herstellen für andere programme > dll mit mingw? int geht ja schon.

diese dll ist eigentlich ein nur ganz kleiner eingriff in python , wo die grundzüge im weiteren programmablauf glaube ich fast garnicht beeinflusst werden.
dieses möchte ich, bzw ist mein ziel.

es geht mir um eine hindernisauswerteroutine die schon in c vorhanden ist, die ich nutzen möchte aber mit dem normalen python .
wxpython habe ich erstmal dafür ausgeschlossen.

darum auch noch einmal oben die floatumwandlung oder ähnliches für die übergabe.


danke für die links, sind sehr wertvoll.

mfg
Zuletzt geändert von sechsrad am Montag 7. April 2008, 09:21, insgesamt 6-mal geändert.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Wenn und falls und wenn wirklich und nur dann
für die bildauswertung jedenfalls.

ich möchte aber im interpreterbereich drin bleiben.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

sechsrad hat geschrieben:ne0h, ich beschäftige mich schon seit längerer zeit mit roboter.
du kennst das hobby nicht. vielleicht hast du auch nicht da geld dazu.
da kommen leicht mit den bauteilen ca 600 euro zusammen.

http://www.roboternetz.de/phpBB2/album_ ... ic_id=2060
Unglaublich: 600€ ! :shock:
Tut mir leid, dass ich jemals an deiner Qualität und ÜBerlgegenheit gezweifelt habe /o\
gameboycam für bilder,
Wow, du bist da wirklich voll drinn, oder?

Was ist übrigens ein
visual-ultrasensor
?
Google bringt mir da nur einen Treffer...und der führt zurück zu deinem Post.
es geht mir um eine hindernisauswerteroutine die schon in c vorhanden ist, die ich nutzen möchte aber mit dem normalen python .
wxpython habe ich erstmal dafür ausgeschlossen.
Ich frage mich, was WxPython damit zu tun hat.
Kurzer helfender Teil: Entweder in Python schreiben und Psyco laufen lassen oder mit Cython die Bibliothek einbinden
mit was kann man eigentlich die python-float mundgerecht herstellen für andere programme > dll mit mingw? int geht ja schon.
Bitte lies die Doku, bevor du hier dämlich rumquakst.
habe auch noch ein board mit propeller-pallax-ship. dieses liegt aber noch zur zeit rum.
Und bitte ekläre mir, was ein "propeller-pallax-ship" ist. Auf mit ship->chip und pallax->parallax findet Google nix :/
also nicht nur daddeln mit python, dieses hobby ist etwas mehr.
Jap. Daddeln mit dem Roboter und der Gameboycam. Und warum denkst du nun, du wärst uns irgendwie über?


Klingt jetzt alles ein bischen hart, aber irgendwie scheinst du es echt nicht mehr zu merken, wie du hier rüber kommst, oder du bist einfach ein arroganter Arsch.

Ps: Ich bin letzteres, den kannst du dir also sparen ;)
Antworten