#python #compilation #pyc
#python #Сборник #pyc
Вопрос:
Это для моего набора тестов.
У меня есть автоматически сгенерированный пакет Python во временной папке. Это все .py
файлы. Я хочу программно скомпилировать их в (a) .pyc
и (b) .pyo
файлы. (Подойдет один тест .pyc
, подойдет другой .pyo
.) Разумеется, это должно быть сделано с помощью активного интерпретатора. Я не хочу импортировать модули, просто скомпилируйте.
Как я могу это сделать?
Ответ №1:
В вашем каталоге Python lib будет вызываться скрипт compileall.py
(например, /usr/lib/python2.6/compileall.py
).
В вашем коде создайте (например, с помощью os.spawnl
) вызов compileall.py
, указывающий на каталог, содержащий сгенерированный вами код. Если вы вызовете его с помощью, python -O
он сгенерирует .pyo
файлы; если вы вызовете его с помощью, python
он сгенерирует .pyc
файл.
Хитрость, я полагаю, заключалась бы в вызове с правильной версией интерпретатора Python.
compileall.py
использует py_compile
под капотом.
Комментарии:
1. Обратите внимание, что правильный способ вызова
compileall
модуля — использоватьpython -m compileall
, А НЕpython /path/to/compileall.py
. И определите местоположение интерпретатора Python с помощьюsys.executable
Ответ №2:
Возможно, вы захотите взглянуть на py_compile
модуль. К сожалению, это не позволит вам выбирать между pyo
и pyc
.
Комментарии:
1. Однако
-O
аргументpython
будет.2. Да, если можно запустить отдельно параметризованный интерпретатор python для каждой из тестовых конфигураций, это не будет проблемой.
Ответ №3:
Обратите внимание, что до тех пор, пока существует разрешение на запись в каталог, из которого импортируется модуль python (*.py), файл *.pyc с тем же именем будет храниться в папке. Более того, *.pyc и *.pyo не увеличивают производительность программы, за исключением уменьшения времени загрузки модулей.
Ответ №4:
выбор между .pyo и pyc возможен с помощью py_compile
импорт py_compile
скомпилируйте как простой байт-код:
py_compile.compile(‘sourcefilename.py ‘, ‘destinationfilename.pyc’, doraise=True )
скомпилируйте как оптимизированный байт-код: оба ‘-o’ и ‘-oo’ могут быть переданы в качестве параметров
py_compile.compile(‘sourcefilename.py ‘, ‘destinationfilename.pyo’,’-oo’, дорезаем=True )
Я пробовал с python 2.7, и, похоже, это работает только тогда, когда вы передаете все параметры.