Вот как я минимизирую требования к диску для основного Python 2.7 на дневной работе:
1) Удалите пакеты из стандартной библиотеки, которая вам не понадобится. Ниже приводится консервативный список:
bsddb/test ctypes/test distutils/tests email/test idlelib lib-tk
lib2to3 pydoc.py tabnanny.py test unittest
Обратите внимание, что некоторые коды Python могут иметь неожиданные зависимости; например setuptools
требуется unittest
для запуска.
2) Предварительно скомпилируйте весь код Python, используя -OO для удаления утверждений и строк документации.
find -name '*.py' | python -OO -m py_compile -
Обратите внимание, что Python по умолчанию не смотрит на .pyo
файлы; Вы также должны явно запросить оптимизацию во время выполнения, используя опцию или переменную окружения. Запустите сценарии одним из следующих способов:
python -OO -m mylib.myscript
PYTHONOPTIMIZE=2 python -m mylib.myscript
3) Удалите .py
файлы исходного кода (если вам не нужно запускать их как скрипты) и .pyc
неоптимизированные файлы.
find '(' -name '*.py' -or -name '*.pyc' ')' -and -not -executable -execdir rm '{}' ';'
4) Сжать файлы библиотеки Python. Python может загружать модули из zip-файла. Пути в zip-файле должны соответствовать иерархии пакетов; таким образом, вы должны объединить каталоги site-packages
и .egg
в основной каталог библиотеки перед архивированием. (Или вы можете добавить несколько zip-файлов в путь Python.)
В Linux путь Python по умолчанию включает уже /usr/lib/python27.zip
, поэтому просто поместите туда zip-файл, и вы готовы к работе.
Оставьте os.pyo
как обычный (не заархивированный) файл, так как Python ищет это как проверку работоспособности. Если вы переместите его в zip-файл, вы получите предупреждение при каждом вызове Python (хотя все будет работать). Или вы можете просто оставить там пустой файл os.py
и поместить настоящий файл в zip-файл.
Заключительные замечания:
- Таким образом, Python помещается в 7 МБ дискового пространства. Можно сделать гораздо больше, чтобы уменьшить размер, но 7 МБ было достаточно мало для моих целей. :)
- Байт-код Python не совместим между версиями, но кого это волнует, когда именно вы выполняете компиляцию, а вы контролируете версию Python?
.pyo
файлы в zip-файле должны быть выигрышем в производительности во всех случаях, если только диск не очень быстрый, а процессор / ОЗУ очень медленный. В любом случае, Python выполняется из памяти, а не из формата на диске, поэтому он влияет только на производительность при загрузке. Хотя удаление строк документации может сэкономить немного памяти.
- Обратите внимание, что
.pyo
файлы не содержат assert
операторов.
.pyo
файлы сохраняют имена функций и номера строк, поэтому отладка не уменьшается: вы все равно получаете хорошие трассировки, вам просто нужно вручную найти номер строки в источнике, что вам в любом случае придется делать.
- Если вы хотите «взломать» файл во время выполнения, просто поместите его в текущий рабочий каталог. Он имеет приоритет над zip-файлом библиотеки.