Python komplett in C integrieren

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Pacnos
User
Beiträge: 19
Registriert: Sonntag 8. Mai 2011, 20:17

Hallo zusammen,

ich habe mir ein Python Programm geschrieben, welches ich teilweise auf PCs installieren muss, wo ich nix installieren kann.
Da ich das ganze in Python 3 geschrieben habe, fallen dummerweise Tools wie Py2Exe etc. weg.
Ich habe mir nun überlegt, dass man ja Python komplett mit C integrieren kann?
Ich habe jetzt angefangen mich durch die ersten Tutorials zu arbeiten und hänge dummerweise jetzt schon fest:

Ich habe mir das erste Beispiel aus der Doku hergenommen:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <Python.h>

int main(void) {
	Py_Initialize();
	PyRun_SimpleString("from time import time,ctime\n"
	                     "print 'Today is',ctime(time())\n");
	Py_Finalize();
	return EXIT_SUCCESS;
}
und einmal kurz zusammengebaut.

Zum entwickeln der Anwendung nehme ich Eclipse für C++ developer. Die Headerdateien habe ich eingebunden und diese werden auch erkannt. In dem Projekt einstellungen habe ich auch unter MinGW C Linker im order Libarys den Pfad zu dem Ordner libs meiner Python installation angebene. Wenn ich das Projekt jetzt installieren will, bekomme ich aber folgenden Fehler:

Code: Alles auswählen

**** Build of configuration Debug for project test ****

**** Internal Builder is used for build               ****
gcc -LC:\Python32\libs -o test.exe src\test.o
src\test.o: In function `main':
C:\Users\Pacnos\Projekte\c++\test\Debug/../src/test.c:16: undefined reference to `_imp__Py_Initialize'
C:\Users\Pacnos\Projekte\c++\test\Debug/../src/test.c:17: undefined reference to `_imp__PyRun_SimpleStringFlags'
C:\Users\Pacnos\Projekte\c++\test\Debug/../src/test.c:19: undefined reference to `_imp__Py_Finalize'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 132  ms.  
Habe ich irgend erwas vergessen was ich einstellen muss, und geht das Überhaupt was ich mir vorgestellt habe, dass ich das Programm ohne seperate Python installation ausführen kann?

Schonmal danke für eure Hilfe
Zuletzt geändert von Anonymous am Samstag 10. Dezember 2011, 11:31, insgesamt 1-mal geändert.
Grund: Quelltext in C-Code-Tags gesetzt.
BlackJack

@Pacnos: Bei dem GCC-Aufruf fehlt IMHO das linken gegen die libpython.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pacnos hat geschrieben:Da ich das ganze in Python 3 geschrieben habe, fallen dummerweise Tools wie Py2Exe etc. weg.
Ja, dann einfach manuell Python 3 dazupacken. Also wenn du deswegen jetzt ein ganz komisches C-Setup machen willst, dass dir die notwendigkeit des Interpreters auch nicht erspart, kann man es sich auch einfach machen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pacnos
User
Beiträge: 19
Registriert: Sonntag 8. Mai 2011, 20:17

@Leonidas

Kannst du das kurz bitte näher ausführen?

Das heißt ich kann einfach meine Python struktur nehmen und mein Programm mit dem Kommando: Pfad\zum\kopierten\Python\Ordner\python.exe main.py aufrufen?


Muss ich da noch irgend etwas mit der Python 32.dll oder ähnliche machen.

Schonmal danke für deine Antwort
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pacnos hat geschrieben:Das heißt ich kann einfach meine Python struktur nehmen und mein Programm mit dem Kommando: Pfad\zum\kopierten\Python\Ordner\python.exe main.py aufrufen?
Absolut richtig. Du musst sonst nix weiter machen, denn Python ist das was man heutzutage "portable" nennen würde, von Haus aus. Was man machen kann, wenn man Zeit, Lust oder Bedarf hat ist alles unnötige zu Löschen, wie etwa alle pyc-Dateien, pyo-Dateien, Unit-Tests, Dokumentation, Development-Dateien, unnötige Packages. So hab ich vor Jahren mal Python 2.5 auf 2.8 MB (komprimiert) eingedampft. Aber man muss nicht, und heutzutage lohnt sich das meist auch nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pacnos
User
Beiträge: 19
Registriert: Sonntag 8. Mai 2011, 20:17

Achso super,

ich dachte immer es gibgt dort nur irgendwelche Abhängigkeiten in der Registry etc. ..

Das heißt aber, dass ich die Python32.dll trotzdem aus dem system32 verzeichniss zu meinem Python Ordner kopieren muss oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pacnos hat geschrieben:ich dachte immer es gibgt dort nur irgendwelche Abhängigkeiten in der Registry etc. ..
Ne, in der Registry wird nur der Installationspfad angegeben (zum Installieren weiterer Module über die EXE-Installer, damit die wissen wo das Programm hin soll) und die Zuordnung von py/pyc/pyo-Dateien zum Python-Interpreter. Nichts was für den eigentlichen Betrieb des Interpreters notwendig ist.
Pacnos hat geschrieben:Das heißt aber, dass ich die Python32.dll trotzdem aus dem system32 verzeichniss zu meinem Python Ordner kopieren muss oder?
Ja, falls die da nicht drin ist, dann musst du sie mitliefern. Komisch, ich denke bei Python 2.x war die früher im Python-Ordner.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Leonidas hat geschrieben:
Pacnos hat geschrieben:Das heißt aber, dass ich die Python32.dll trotzdem aus dem system32 verzeichniss zu meinem Python Ordner kopieren muss oder?
Ja, falls die da nicht drin ist, dann musst du sie mitliefern. Komisch, ich denke bei Python 2.x war die früher im Python-Ordner.
Oh je, das ist ja ein Ding. Ich versuche gerade Python in C einzubetten und musste das ganze Python Projekt in PC/VC8.0 kompilieren. Nutze hierfür Visual Studio 2010 und Python 2.7.2. Und das nur weil ich die DLL nicht gefunden habe . Jetzt schau ich in mein Windows/system32: tatsächlich, da ist sie.

D.h. also ich kann Python noch einfacher in C einbetten, indem ich die windows/system32/Python27.dll, die libs aus Python27/libs und gegebenfalls die DLLs (PYDs) in Python27/DLL einbinde ? Somit erspare ich mir das Kompilieren von Python und der Bibliotheken _socket, _sqllite3 etc. ?
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Irgendwie funzt das nicht, ich erhalte:

Code: Alles auswählen

Error	1	error LNK2001: unresolved external symbol __imp__Py_Initialize	C:\Users\Alexander\Dev\Projekte\Python01\Python01\main.obj	Python01
Error	2	error LNK2001: unresolved external symbol __imp__PyRun_SimpleStringFlags	C:\Users\Alexander\Dev\Projekte\Python01\Python01\main.obj	Python01
Error	3	error LNK2001: unresolved external symbol __imp__Py_Finalize	C:\Users\Alexander\Dev\Projekte\Python01\Python01\main.obj	Python01
Error	4	error LNK1120: 3 unresolved externals	C:\Users\Alexander\Dev\Projekte\Python01\Release\Python01.exe	Python01
Nutze die python27.lib, Visual Studio 2010 und Win7 64-bit. Könnte es sein, dass die lib nur für 32-bit systeme funktioniert ?

P.S.: Ich habe meine Python Installation (64-bit) deinstalliert, dann Python 32-Bit installiert. Jetzt geht es :P :P :P

Ich schaue mir demnächst http://cython.org/ an.

Der Nachteil bei Py2Exe & Co. ist ja, dass der Python-Quellcode nicht kompiliert wird. Es wird nur ein Paket geschnürt, damit Anwender den Interpreter nicht extra installieren müssen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

webskipper hat geschrieben:Der Nachteil bei Py2Exe & Co. ist ja, dass der Python-Quellcode nicht kompiliert wird. Es wird nur ein Paket geschnürt, damit Anwender den Interpreter nicht extra installieren müssen.
Ja und, wo ist das Problem damit? Du willst doch nicht etwa Quellcode verschleiern?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Ich persönlich sehe da kein Problem, ich sage nur, dass da nix übersetzt wird.
BlackJack

@webskipper: Du sagst, dass das ein *Nachteil* ist, also muss es ja irgendwie ein Problem sein!? Was ist denn der Nachteil daran?
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Wie schon gesagt, dass der Code nicht übersetzt wird. Der Titel des Threads lautet doch "Python komplett in C integrieren". Das macht Py2Exe ja nicht.
BlackJack

@webskipper: Ich sehe aber immer noch nicht den Nachteil. Eine einzelne ausführbare Datei war mal auf dem C64 ein erstrebenswertes Ziel. Das ist es heute nicht mehr. Solange es der Endanwender einfach installieren kann, zum Beispiel über einen Installer oder einfach ein Archiv irgendwohin entpacken, ist doch egal ob das nun eine oder ein paar mehr Dateien sind.
webskipper
User
Beiträge: 15
Registriert: Freitag 9. Dezember 2011, 19:11

Jepp,

das habe ich aber nicht gemeint. Mir gings darum, dass man mit Lösungen wie z.B. Cython Python-Programme in Maschinencode übersetzen kann. Das Interpretieren fällt weg. Für bestimmte Berechnungen ist das eine feine Sache.

Bin aber selbst noch dabei Cython zu evaluieren. PyPy als verbesserter Interpreter finde ich auch interessant.
BlackJack

@webskipper: Wenn Du einfach nur Cython auf reines Python loslässt, dann fällt aber auch tatsächlich nur das Interpretieren des Bytecodes weg. Also statt einem C-Programm, dass in einer Schleife mit einem grossen ``swicth`` die Bytecodes in Funktionsaufrufe umsetzt, ersetzt Du im Grunde bei Cython die Bytecodes durch direkte Aufrufe der Funktionen, die sonst in dem besagten `swicth`` erfolgt wären. Das ist nur ein recht kleiner Teil der Zeit die ein Python-Programm zur Laufzeit verbraucht. Die ganzen anderen dynamischen Eigenschaften, die Python langsam machen, hast Du dann immer noch.
Antworten