Почему 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, компилируемые во время выполнения.

gertvdijk
источник
Поэтому я должен сделать /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