Por que py e não pyc ou pyo?

8

Quando instalo um pacote deb python, digamos que python-numpyos arquivos sejam arquivos python simples. Como eu digo ao gerente de pacotes - que eu realmente prefiro usar arquivos pyc ou melhor ainda - pyo?

Adobe
fonte

Respostas:

12

Você já os possui e já os está usando

Aplicativos Python bem compactados estão sendo compilados em .pycarquivos em um script executado após a instalação dos arquivos. Isso é necessário de acordo com as diretrizes de empacotamento para poder adotar a instalação do Python que você está usando naquele momento. Lembre-se de que os .pycarquivos são muito específicos ao seu sistema (versão e dependências do Python).

Portanto, todos os arquivos .pyoe .pycsão excluídos especificamente nos pacotes e marcados como erros pelo Lintian :

Arquivos de origem python compilados não devem ser incluídos no pacote. Esses arquivos devem ser removidos do pacote e criados no momento da instalação do pacote no postinst.

Consulte a seção 2.6 da Debian Python Policy ( Modules Byte-Compilation ) para obter detalhes.

Gravidade: grave, Certeza: certa

No caso python-numpydesta compilação de bytes pós-instalação, ela é manipulada pelo gancho debhelper do pycentral. Após a instalação, fica assim:

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

Mais algumas informações básicas

O motivo pelo qual esses arquivos .pyc/ .pyonão são compilados em tempo de execução durante a primeira inicialização do aplicativo, conforme o esperado, é o seguinte.

Os arquivos Python são instalados em um diretório de todo o sistema, disponível para todos os usuários no sistema. Sempre que um usuário inicia o aplicativo, o interpretador Python pode ler os .pyarquivos, mas não pode gravar nos diretórios (por exemplo /usr/lib/python2.7/dist-packages/). Isso faz parte da segurança geral em todos os sistemas Linux; os usuários não devem escrever /usr, apenas com direitos de root isso deve ser possível. Por esse motivo, os ganchos do APT compilarão os arquivos Python para você no momento da instalação; em primeiro lugar, para minimizar o tamanho do pacote, em segundo lugar, para poder reativar os ganchos quando algo mudar no seu sistema em relação ao Python, porque é necessário recompilar quando ficarem incompatíveis durante as atualizações, por exemplo.

No entanto, isso não afetará os arquivos python comuns pertencentes ao usuário que estão sendo compilados em tempo de execução.

gertvdijk
fonte
Portanto, devo tornar /usr/share/pyshared/gravável para mim mesmo - para permitir que o python compile arquivos na primeira execução.
Adobe
4
@Adobe What? não! Nunca torne esses diretórios do sistema graváveis ​​para os usuários. Seu gerenciamento de pacotes já os compilou para você (conforme o que eu estava tentando dizer na minha resposta). Agora atualizado para ser mais claro.
precisa saber é
Você agora - que acabei de ver /usr/lib/python2.7/dist-packages/numpy- há pycarquivos. Lembro que procurei lá em instalações seveal - e havia apenas arquivos py simples. Então eu meio que "não consigo reproduzir o bug".
Adobe
A única razão pela qual .pycainda não estaria lá é que o pacote não foi instalado completamente. Depois de desembalar, existem outras etapas a serem seguidas. IIRC, o gancho python-central é executado somente após a instalação de todos os pacotes. Portanto, em uma sessão APT em execução ou interrompida, instalando o pacote, a observação que você descreveu pode ser feita provavelmente.
precisa saber é