Ответы:
Хорошо упакованные приложения 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/lib/python2.7/dist-packages/numpy
- есть pyc
файлы. Я помню, я смотрел там на отдельных установках - и там были просто простые файлы py. Так что я вроде "не могу воспроизвести ошибку".
.pyc
еще не было, заключается в том, что пакет не был установлен полностью. После распаковки есть и другие шаги. IIRC python-central hook запускается только после установки всех пакетов. Таким образом, в запущенном или прерванном сеансе APT, устанавливающем пакет, вы, вероятно, сделаете описанное вами наблюдение.
/usr/share/pyshared/
доступным для записи самому себе - чтобы позволить Python компилировать файлы при первом запуске.