Почему py, а не pyc или pyo?


8

Когда я устанавливаю deb-пакет python, скажем, python-numpyчто файлы - это простые файлы python. Как мне сказать менеджеру пакетов - что я на самом деле предпочел бы использовать pyc или, что еще лучше, pyo-файлы?

Ответы:


12

У вас уже есть и вы уже используете их

Хорошо упакованные приложения Python компилируются в .pycфайлы в сценарии, запускаемом после установки файлов. Это необходимо в соответствии с рекомендациями по упаковке, чтобы иметь возможность адаптироваться к установке Python, которую вы используете в данный момент. Помните, что .pycфайлы очень специфичны для вашей системы (версия Python и зависимости).

Поэтому все файлы .pyoи .pycфайлы специально исключены из пакетов и помечены как ошибки Lintian :

Скомпилированные исходные файлы Python не должны быть включены в пакет. Эти файлы должны быть удалены из пакета и созданы во время установки пакета в postinst.

За подробностями обращайтесь к разделу 2.6 Политики Debian Python ( Байт-компиляция модулей ).

Серьезность: серьезная, Определенность: определенная

В случае python-numpyэтой пост-инсталляции байтовая компиляция обрабатывается обработчиком debhelper pycentral. После установки это выглядит так:

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc

Еще немного справочной информации

Причина того, почему эти .pyc/ .pyoфайлы не скомпилированы во время выполнения при первом запуске приложения, как вы ожидали, заключается в следующем.

Файлы Python устанавливаются в общесистемный каталог, доступный для всех пользователей системы. Всякий раз, когда пользователь запускает приложение, интерпретатор Python может читать .pyфайлы, но не может записывать в каталоги (например /usr/lib/python2.7/dist-packages/). Это часть общей безопасности во всех системах Linux; пользователи не должны писать /usr, только с правами root это должно быть возможно. По этой причине хуки APT будут компилировать файлы Python для вас во время установки; во-первых, чтобы минимизировать размер пакета, во-вторых, чтобы иметь возможность перезапускать хуки, когда что-то меняется в вашей системе относительно Python, потому что требуется перекомпилировать, например, когда они становятся несовместимыми во время обновлений.

Это, однако, не повлияет на обычные пользовательские файлы python, компилируемые во время выполнения.


Поэтому я должен сделать /usr/share/pyshared/доступным для записи самому себе - чтобы позволить Python компилировать файлы при первом запуске.
Adobe

4
@ Adobe Что? нет! Никогда не делайте эти системные каталоги доступными для записи для пользователей. Ваше управление пакетами уже скомпилировало их для вас (согласно тому, что я пытался сказать в своем ответе). Теперь обновленный, чтобы быть более ясным об этом.
gertvdijk

Вы сейчас - что я только что посмотрел /usr/lib/python2.7/dist-packages/numpy- есть pycфайлы. Я помню, я смотрел там на отдельных установках - и там были просто простые файлы py. Так что я вроде "не могу воспроизвести ошибку".
Adobe

Единственная причина, почему этого .pycеще не было, заключается в том, что пакет не был установлен полностью. После распаковки есть и другие шаги. IIRC python-central hook запускается только после установки всех пакетов. Таким образом, в запущенном или прерванном сеансе APT, устанавливающем пакет, вы, вероятно, сделаете описанное вами наблюдение.
gertvdijk
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.