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 :oops:
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 :o)
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 :oops:

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

Code: Alles auswählen

import test2
test2.py

Code: Alles auswählen

import sys

print "test2"
print sys.path
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:

Code: Alles auswählen

python -OO test.py
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" :roll:

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 :lol:

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 :D

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 :D

Du willst nicht das andere in deinem Source herumpfuschen der eigentlich sowieso nicht sichtbar ist?

lgherby