Seite 1 von 1
[Python] aus *.py eine *.pyc oder *.pyo erstellen ?
Verfasst: Donnerstag 26. April 2007, 05:59
von bossi
Hi zusammen,
ich bin ein Newbie in Python
Habe mir eine kleine Klasse geschrieben und wollte mal Fragen ob man diese vorkompilieren kann ?
Kann man aus einer [*.py] eine [*.pyc] oder [*.pyo] machen und dann in einen z.B. test.py importieren
Oder gibt es überhaupt eine Möglichkeit eine .py binär zu erstellen ?
Gruß
Bossi
Verfasst: Donnerstag 26. April 2007, 08:07
von jens
Der Python Interpreter macht das beim ersten import ganz von alleine
Wenn die source-py Datei verändert wird, aktualisiert er auch die *.pyc Datei voll automatisch...
Also du brauchst dich um sowas nicht kümmern
Man kann es dennoch auch zu Fuss machen, wenn man Spass hat:
http://effbot.org/zone/python-compile.htm
Verfasst: Donnerstag 26. April 2007, 08:18
von bossi
Hi,
ich will eigentlich mein Script davor schützen das nicht jeder drin umschreiben kann
)
Also möchte ich aus der .py eine .pyc machen und diese dann in einer anderen .py einbinden.
Aber der Link macht das in der Beschreibung nicht so oder, mein English ist nicht so dolle
Verfasst: Donnerstag 26. April 2007, 08:30
von jens
Auch wenn ich nicht verstehen kann, warum man sowas tun sollte... Ich hab mal schnell einen Test gemacht:
test.py
test2.py
nun führt man einmal test.py aus... Dabei werden die Dateien test.pyc und test2.pyc erstellt... Nun kann man test2.py löschen und dennoch das test.py ausführen und es läuft.
Fazit: Man kann ohne weiteres alle *.py löschen, wenn *.pyc Dateien existieren. Mit dem "StartSkript" (In dem Beispiel: test.py) funktionierte das spontan nicht.
Aus den *.pyc Dateien kann man allerdings theoretisch wieder *.py Dateien generieren. Faktisch sieht es aber so aus, das es IMHO z.Z. kein freies Tool dafür gibt.
btw. man kann auch einen Schritt weiter geben und "Opzimize" verwenden. Also das Startskript so starten:
Dabei wird eine test2.pyo erstellt, statt eine *.pyc... Und wie man schon vermutet, nur die *.pyo Datei ist zum starten notwendig...
Vielleicht willst du auch nur eine EXE Datei erstellen? Dann schau mal hier: [wiki]FAQ#WoGibtEsEinenPythonCompiler[/wiki]
btw. Wir sollten man ein Punkt in die FAQ einfügen: "Ich möchte meinen Quellentext verschlüsseln"
Verfasst: Donnerstag 26. April 2007, 08:31
von bossi
So gehts:
Code: Alles auswählen
import compileall
compileall.compile_dir(".", force=1)
Aber jetzt hat er alle *.py zu pyc gemacht, habe es mit Pfad versucht:
Code: Alles auswählen
import compileall
compileall.compile_dir("E:\test.py", force=1)
Aber das kommt immer:
>>> compileall.compile_dir("e:\\test.py", force=1)
Listing e:\test.py ...
Can't list e:\test.py
1
Verfasst: Donnerstag 26. April 2007, 08:33
von bossi
Nein ich will keine exe erstellen, das soll für ein Website sein
Verfasst: Donnerstag 26. April 2007, 08:35
von jens
Jo, dann lad einfach nur die *.pyc oder *.pyo Dateien hoch (Bis auf das Startskript)...
IMHO sollten die *.pyo auch ein klein wenig performanter sein
Dann hast du im Prinzip genau das, was du möchtest... Erstmal kann keiner in dein Skript schauen...
@bossi: Es heißt ja auch compile_
dir und nicht compile_
file
EDIT Es gibt auch ein py_compile.compile():
http://www.python.org/doc/current/lib/m ... mpile.html
Verfasst: Donnerstag 26. April 2007, 08:54
von bossi
Also besser ein pyo statt eine pyc, kannst mir mal ein Beispiel geben zu dein Link
Verfasst: Donnerstag 26. April 2007, 09:19
von jens
Nimm doch einfach compileall.compile_dir()
So wie ich die Doku verstehe, kommen *.pyo Dateien raus, wenn der aktuell gestartete Interpreter auch mit -OO gestartet wurde... Weiß es aber nicht genau... teste es mal...
Schau dir mal den Thread
http://www.python-forum.de/topic-7472.html zum Thema Optimize an. Dort steht auch, was da überhaupt passiert.
Verfasst: Mittwoch 9. Mai 2007, 20:55
von thelittlebug
bossi hat geschrieben:Nein ich will keine exe erstellen, das soll für ein Website sein
hmm...
spätestens jetzt ist jeglicher sinn dahinter zumindest für mich verloren
Du willst nicht das andere in deinem Source herumpfuschen der eigentlich sowieso nicht sichtbar ist?
lgherby