2013-08-19 5 views
8

Ich bündle eine Python-Anwendung zusammen mit ihrer virtuellen Umgebung in einem RPM zur einfacheren Bereitstellung. Ist es eine gute Entscheidung, alle .pyo und .pyc Dateien wegzulassen?Darf ich .pyo und .pyc Dateien in einem RPM weglassen?

Was ich stattdessen tun würde, ist compileall.py in der Post-Installation Aktion innerhalb der virtenv Instanz aufrufen. Funktioniert das, oder wird das alles vermasseln?

Hinweis: Mir ist klar, dass ich eine Maschine anprobieren könnte, aber a.) Das würde mir keine schlüssige Antwort geben, ob das auf anderen Rechnern funktioniert und b.) Andere haben vielleicht die gleiche Frage und ich fand es nicht beantwortet.

Antwort

3

Sie in der Tat sie weglassen könnte - sie entweder erzeugt werden (wenn Sie Schreibzugriff haben) oder die .py jedes Mal, wenn Sie es importieren analysiert wird (die Zeit kostet).

Aber je nach Distribution, könnte Ihr RPM-System einfache Skripte enthält .py Dateien zum Kompilieren und bündelt die .pyo und .pyc Dateien auf Verteilung, die die Aufgabe ganz einfach macht.

$ rpm --showrc | grep -A 7 py.*_compile 
-14: py3_compile(O) 
find %1 -name '*.pyc' -exec rm -f {} ";" 
python3 -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
%{-O: 
find %1 -name '*.pyo' -exec rm -f {} ";" 
python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
} 
-14: py3_incdir /usr/include/python3.3m 
-- 
-14: py_compile(O) 
find %1 -name '*.pyc' -exec rm -f {} \; 
python -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
%{-O: 
find %1 -name '*.pyo' -exec rm -f {} \; 
python -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1 
} 
-14: py_incdir %{py_prefix}/include/python%{py_ver} 

I. e., Können Sie %py_compile bzw. setzen. %py3_compile in Ihrem %build Abschnitt und Sie haben, was Sie brauchen.

Aber wie gesagt, Sie können sie auch weglassen, wenn Sie sie von mehreren Python-Installationen verschiedener Versionsnummern verwenden möchten. Aber dann sollten Sie sicherstellen, dass die .pyc und .pyo Dateien nie erstellt werden, da dies Dinge vermasseln könnte.

+0

Whoa, nett. Gibt es eine Möglichkeit, den verwendeten "Python" außer Kraft zu setzen? Wie ich in meiner Frage geschrieben habe, ist es in einem "Vierenv". Randnotiz: Der Hauptgrund, sie wegzulassen, ist die resultierende Größe des Pakets. – 0xC0000022L

+0

Sie können es überschreiben, indem Sie die genannten Makros in Ihrer Datei '.rpmrc' oder' .rpmmacros' ersetzen. – glglgl

+0

Verwenden Sie den Schalter '--define' selbst, da der gesamte Build-Schritt Skript ist und einige der Definitionen berechnet werden. – 0xC0000022L

1

Es ist sicher, solange Sie ihre .py Dateien haben. Als .pyo und .pyc Dateien werden von den ursprünglichen .py Dateien generiert.

Siehe auch What do the python file extensions, .pyc .pyd .pyo stand for? und If Python is interpreted, what are .pyc files?

+1

Danke. Ich weiß * was * sie sind, aber ich möchte sie immer noch nach der RPM-Installation neu generieren. Also meine Frage geht es ein wenig über den Rahmen Ihrer Antwort :) (auch w.r.t. die Tatsache, dass ich 'virtenv' verwende, das einige Regeln zu ändern scheint) – 0xC0000022L

Verwandte Themen