2013-08-19 35 views
8

Łączę aplikację Python ze środowiskiem virtenv wewnątrz pakietu RPM w celu łatwiejszego wdrożenia. Czy jest to dobra decyzja, aby pominąć wszystkie pliki .pyo i .pyc?Czy mogę pominąć pliki .pyo i .pyc w RPM?

Zamiast tego, chciałbym wywołać compileall.py w akcji poinstalacyjnej z poziomu instancji virtenv. Czy to działa, czy może to zepsuć rzeczy?

Uwaga: zdaję sobie sprawę, że mógłbym wypróbować na jednej maszynie, ale a.) Nie dałoby mi to jednoznacznej odpowiedzi, czy to zadziała na innych maszynach i b.) Inni mogą mieć to samo pytanie i ja nie znalazłem odpowiedzi.

Odpowiedz

3

Można rzeczywiście je pominąć - są one generowane albo (jeśli masz dostęp do zapisu) lub .py jest analizowany za każdym razem go zaimportować (który kosztuje czas).

Jednak, w zależności od dystrybucji, system RPM może zawierać proste skrypty dla kompilacji .py plików i zepnij .pyo i .pyc plików na dystrybucję, co sprawia, że ​​zadanie dość łatwe.

$ 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., Można umieścić %py_compile lub %py3_compile do sekcji %build i masz to, czego potrzebujesz.

Ale, jak powiedziano, ty również możesz je pominąć, jeśli chcesz używać ich z kilku instalacji Pythona o różnych numerach wersji. Ale wtedy powinieneś się upewnić, że pliki .pyc i nigdy nie zostały utworzone, ponieważ może to zepsuć rzeczy.

+0

Whoa, nice. Czy istnieje jednak sposób na przesłonięcie użytego 'pythona'? Jak napisałem w moim pytaniu, jest ono wewnątrz "virtenv". Notatka: głównym powodem ich pominięcia jest wynikowy rozmiar paczki. – 0xC0000022L

+0

Możesz go zastąpić, zastępując wymienione makra w pliku '.rpmrc' lub' .rpmmacros'. – glglgl

+0

przy użyciu samego przełącznika '--define', ponieważ cały krok kompilacji jest skryptowany, a niektóre z jego definicji są obliczane. – 0xC0000022L

1

Jest to bezpieczne, o ile masz ich pliki .py. Pliki .pyo i .pyc są generowane z oryginalnych plików .py.

Zobacz także What do the python file extensions, .pyc .pyd .pyo stand for? i If Python is interpreted, what are .pyc files?

+1

Dzięki. Wiem * czym * oni są, ale nadal chciałbym je ponownie wygenerować po zainstalowaniu RPM. Moje pytanie brzmi więc nieco poza zakres twojej odpowiedzi :) (także w.r.t. fakt, że używam 'virtenv', który wydaje się zmieniać niektóre zasady) – 0xC0000022L

Powiązane problemy