[Python] aus *.py eine *.pyc oder *.pyo erstellen ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
bossi
User
Beiträge: 17
Registriert: Donnerstag 26. April 2007, 05:55

[Python] aus *.py eine *.pyc oder *.pyo erstellen ?

Beitragvon bossi » Donnerstag 26. April 2007, 05:59

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

Beitragvon jens » Donnerstag 26. April 2007, 08:07

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
bossi
User
Beiträge: 17
Registriert: Donnerstag 26. April 2007, 05:55

Beitragvon bossi » Donnerstag 26. April 2007, 08:18

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

Beitragvon jens » Donnerstag 26. April 2007, 08:30

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=]python -OO test.py[/code]
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:
Zuletzt geändert von jens am Donnerstag 26. April 2007, 08:33, insgesamt 1-mal geändert.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
bossi
User
Beiträge: 17
Registriert: Donnerstag 26. April 2007, 05:55

Beitragvon bossi » Donnerstag 26. April 2007, 08:31

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
bossi
User
Beiträge: 17
Registriert: Donnerstag 26. April 2007, 05:55

Beitragvon bossi » Donnerstag 26. April 2007, 08:33

Nein ich will keine exe erstellen, das soll für ein Website sein ;)
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 26. April 2007, 08:35

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
bossi
User
Beiträge: 17
Registriert: Donnerstag 26. April 2007, 05:55

Beitragvon bossi » Donnerstag 26. April 2007, 08:54

Also besser ein pyo statt eine pyc, kannst mir mal ein Beispiel geben zu dein Link :D
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 26. April 2007, 09:19

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
thelittlebug
User
Beiträge: 187
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Beitragvon thelittlebug » Mittwoch 9. Mai 2007, 20:55

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder