Python: программная компиляция пакета Python в файлы pyc или pyo

#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, и, похоже, это работает только тогда, когда вы передаете все параметры.