PyPy

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 8. August 2005, 06:39

Leonidas hat geschrieben:Jens, vielleicht fehlt beim gcc noch das -lpython?
Nein das hatte ich nicht! Das scheind zu funktionieren... Als Ergebnis erhalte ich eine *.o Datei. Es gibt jediglich eine Warnung:

Code: Alles auswählen

/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
Das dürfte aber wohl nicht schlimm sein, was?

Nun versuche ich eine echte Ausführbare Datei mit gcc -I -lpython -o test test.o zu erzeugen. Dabei erhalte ich nun wieder die bekannten undefined reference Fehler:

Code: Alles auswählen

D:\Python\PyPy v0.6.1>gcc -I -lpython -o test test.o
test.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
test.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
test.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
test.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'
test.o(.text+0x10e):test.c: undefined reference to `_imp__PyDict_SetItem'
test.o(.text+0x173):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x17a):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x18c):test.c: undefined reference to `_imp__PyType_IsSubtype'
test.o(.text+0x1b3):test.c: undefined reference to `_imp__PyInt_Type'
test.o(.text+0x1ba):test.c: undefined reference to `_imp__PyInt_Type'

...
Laut der Doku http://www.mingw.org/docs.shtml#compilingandbuilding soll es auch direkt gehen... Also versuche ich es mit gcc -I -lpython -o test test.c Obwohl ich hier ja das -lpython angegeben hab, kommen wieder diese "undefined reference"-Fehler...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 8. August 2005, 09:55

Ich vermute mal, dass dein MinGW libpython24.a oder python24.lib nicht finden kann. Klappen den Kompilationen von normalen Distutils-Modulen?
Du musst warscheinlich noch den Pfad dazu über -L/pfad/zu/den/libs angeben.

Bei PyPy wird doch auch die Python Stdlib neu in Python geschrieben (also das was noch nicht in Python ist)? Somit könnte man diese doch auch in IronPython nutzen, oder gibt es da irgendwelche größeren Probleme?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Montag 8. August 2005, 11:27

jens hat geschrieben:Nun versuche ich eine echte Ausführbare Datei mit gcc -I -lpython -o test test.o zu erzeugen. Dabei erhalte ich nun wieder die bekannten undefined reference Fehler:

Code: Alles auswählen

D:\Python\PyPy v0.6.1>gcc -I -lpython -o test test.o
test.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
test.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
test.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
test.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'
test.o(.text+0x10e):test.c: undefined reference to `_imp__PyDict_SetItem'
test.o(.text+0x173):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x17a):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x18c):test.c: undefined reference to `_imp__PyType_IsSubtype'
test.o(.text+0x1b3):test.c: undefined reference to `_imp__PyInt_Type'
test.o(.text+0x1ba):test.c: undefined reference to `_imp__PyInt_Type'

...
Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen... Du musst die datei als .DLL oder .SO linken, damit du sie dann in Python importieren kannst.

Ich würde dir wirklich empfehlen die Distutils zu benutzen. Wie das geht, steht hier.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 8. August 2005, 12:03

Leonidas hat geschrieben:Ich vermute mal, dass dein MinGW libpython24.a oder python24.lib nicht finden kann.
Ich hab nun beide angegeben... Tut's auch nicht:
gcc -I -l \Python\Python24\libs\python24.lib \Python\Python24\libs\libpython24.a -o test test.c

Code: Alles auswählen

In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
                 from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
d:\temp/ccsvaaaa.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
d:\temp/ccsvaaaa.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
d:\temp/ccsvaaaa.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
d:\temp/ccsvaaaa.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'

...
ProgChild hat geschrieben:Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen...
Tja, ich weiß nicht... Ich wollte es einfach mal versuchen... Hab aber keine Erfahrung mit gcc & Co :oops:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 8. August 2005, 12:12

Nein, jens, die Option ist -L nicht -l. -l gibt an gegen welche Bibliotheken du linkst und -L in welchem Ordner die Bibliotheken sind. Du musst sowohl bei -L den Ordner angeben als auch -lpython bzw. -lpython24.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 8. August 2005, 12:22

Hm... Ein gcc -I -L \Python\Python24\libs -l python24.lib -l libpython24.a -o test test.c liefert folgendes:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: \Python\Python24\libs: No such file: Permission denied
collect2: ld returned 1 exit status

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 8. August 2005, 12:28

Ups :oops: So geht's wohl besser:
gcc -I -L\Python\Python24\libs\ -l python24.lib libpython24.a -o test test.c
Aber nicht Fehlerfrei:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
gcc: libpython24.a: No such file or directory
Obwohl in \Python\Python24\libs\ wirklich die libpython24.a vorhanden ist...

Hab auch noch einige Varianten Probiert, aber irgendwie bekomme ich kein richtiges Ergebnis:
gcc -I -Ld:\Python\Python24\libs -l python24.lib -o test test.c
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lpython24.lib
collect2: ld returned 1 exit status

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Montag 8. August 2005, 13:20

jens hat geschrieben:
ProgChild hat geschrieben:Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen...
Tja, ich weiß nicht... Ich wollte es einfach mal versuchen... Hab aber keine Erfahrung mit gcc & Co :oops:
Wie willst du denn das Modul als Anwendung linken? Du hast doch garkeinen Startpunkt... Du hast nur Funktionen da drinn...

Dein Python Modul kann nur von dem Python Interpreter geladen und ausgeführt werden. Ohne den kannst du keine Ausführbare Datei bekommen.

Du hast also zwei Möglichkeiten: Entweder, du schreibst ein Python Modul, dass dein Modul aufruft, oder du schreibst ein C Programm, dass den Python Interpreter einbindet und dann ein Modul aufruft.

Einen anderen Weg sehe ich nicht.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 8. August 2005, 13:42

ProgChild hat geschrieben:Du hast doch garkeinen Startpunkt... Du hast nur Funktionen da drinn...
Da hast du natürlich recht, wenn man sich nochmal http://www.python-forum.de/viewtopic.php?p=21786#21786 anschaut, gibt's nur die test()...

Aber ich glaube das erklärt nicht die Fehlermeldung beim gcc...

Wenn das alles klappten würde, könnte man sich doch schon vorstellen, das man eine Klasse definiert, die dann von einem mini C Programm aus aufgerufen wird...

Wie Praktikabel das ganze sein wird, weiß ich nicht...

Ich finde es nur schön, wenn man irgendwie doch eine echte EXE erzeugen könnte anstatt dem py2exe Kram... (Träumen darf man ja wohl noch :lol: )
Es kommen immer wieder Anwender, die nach einem Python-Compiler fragen. Also ich glaube das Interesse ist schon sehr groß und es würde Python für einige sehr viel Interessanter machen!

Der größte Nachteil von Py2exe ist es, das selbst kleinste Skripte richtig groß werden :(
Wobei eine andere Variante wäre noch, Python selber auf ein Minimum zu verkleinern... Das nur ein paar Dateien nötig sind, um überhaupt ein Mini-Python zu machen haben wir ja hier http://www.python-forum.de/viewtopic.php?t=3666 rausgefunden...
Ich hab nochmal eine Mini-Version erstellt und mit UPX die python.dll gepackt. Somit ist das mini-Python 852KB groß...

Wobei, hab gerade hier http://starship.python.net/crew/theller ... ompression unter Punkt 6 "7ZIP and UPX" gefunden, das es auch bei py2exe noch einiges Einsparungspotential gibt... Da bekommt man für 804KB schon eine fertige Geschichte... Naja, eine echte Compiler EXE wäre wahrscheinlich nochmal um einiges kleiner :(

Wie dem auch sei... Vielleicht wird PyPy uns irgendwann mal eine super Alternative liefern...

Ich wollte ja eigentlich nur mal eben gucken, was mit PyPy schon möglich ist... Das das jetzt so ausgeufert ist, war eigentlich nicht beabsichtigt...

Ich meine ich hab sowieso immer ein Python installiert und brauche nicht wirklich eine EXE ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 8. August 2005, 14:53

Jens, gcc nimmt bei -l nicht dateinamen, er macht das so: -lpython24 (ein Argument ohne Freizeichen) lädt libpython24.a, das heißt immer ohne das "lib"-Prefix. So wird aus libSDL.a -lSDL und aus libz.a -lz.

Hast du dir schon mal freeze aus dem Python-Tarball angeschaut? Das kommt glaube ich dem näher was du machen willst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 8. August 2005, 20:38

Leonidas hat geschrieben:Jens, gcc nimmt bei -l nicht dateinamen, er macht das so: -lpython24 (ein Argument ohne Freizeichen) lädt libpython24.a, das heißt immer ohne das "lib"-Prefix. So wird aus libSDL.a -lSDL und aus libz.a -lz.
Also wäre ein korrekter Aufruf so:
gcc -I -Ld:\Python\Python24\libs -lpython24 -o test test.c

Das bringt aber auch nur:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lpython24
collect2: ld returned 1 exit status
Leonidas hat geschrieben:Hast du dir schon mal freeze aus dem Python-Tarball angeschaut? Das kommt glaube ich dem näher was du machen willst.
Du meinst das http://cvs.sourceforge.net/viewcvs.py/p ... e/#dirlist ???
Hört sich nett an:
Freeze a Python script into a binary.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 8. August 2005, 21:01

jens hat geschrieben:Das bringt aber auch nur:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lpython24
collect2: ld returned 1 exit status
Hast du denn alles nötige dort drin? Die libpython24.a musste ich soweit ich mich erinnert kann selbst generieren.
Leonidas hat geschrieben:Hast du dir schon mal freeze aus dem Python-Tarball angeschaut? Das kommt glaube ich dem näher was du machen willst.
jens hat geschrieben:Du meinst das http://cvs.sourceforge.net/viewcvs.py/p ... e/#dirlist ???
Genau das, das findest du auch seit langem im Python-Sourcen-Tarball.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 9. August 2005, 06:21

Leonidas hat geschrieben:Hast du denn alles nötige dort drin? Die libpython24.a musste ich soweit ich mich erinnert kann selbst generieren.
Nein, die ist im Python-Verz. unter libs vorhanden...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten