fedora / usr / lib vs / usr / lib64

4

Parece que tenho duas pastas python2.6 localizadas em / usr / lib vs / usr / lib64, respectivamente. A maioria das coisas python (fonte) está em /usr/lib64/python2.6 mas quando em pacotes instalados eles foram colocados em /usr/lib/python2.6

Como o sistema decide a qual diretório ir quando o python é solicitado, e como ele encontra o pacote que eu instalei?

    
por Weiwei 31.08.2009 / 02:25

2 respostas

1

Qualquer fonte que esteja sendo instalada em / usr / lib64 deve ser a partir da instalação de pacotes src ou devel que, por padrão, são selecionados por sua arquitetura.

/ usr / lib deve ter apenas bibliotecas de 32 bits - da mesma forma / usr / lib64 deve ser a versão de 64 bits. Descobri que o yum instalará ocasionalmente os 32 & Versões de 64 bits de algumas bibliotecas, e existem algumas bibliotecas ainda a serem portadas para 64 bits, então se você é um aplicativo particular ou uma biblioteca instalada para / usr / lib as probabilidades são apenas para satisfazer uma dependência de 32 bits ou erro para cima.

    
por 31.08.2009 / 02:48
7

Esta resposta simples é que os pacotes construídos sem qualquer extensão C / nativa devem acabar sob a lib, qualquer um com extensões nativas acabará na lib64 em sistemas multilib. Quanto ao modo como ele encontra os pacotes está contido em sys.path - isso é de um sistema x86_64 F-11:

>>> import sys
>>> for pth in sys.path: print pth
... 

/usr/lib64/python26.zip
/usr/lib64/python2.6
/usr/lib64/python2.6/plat-linux2
/usr/lib64/python2.6/lib-tk
/usr/lib64/python2.6/lib-old
/usr/lib64/python2.6/lib-dynload
/usr/lib64/python2.6/site-packages
/usr/lib64/python2.6/site-packages/Numeric
/usr/lib64/python2.6/site-packages/gst-0.10
/usr/lib64/python2.6/site-packages/gtk-2.0
/usr/lib/python2.6/site-packages

A resposta mais detalhada sobre como os pacotes chegam lá requer um pouco de compreensão sobre como o python funciona em termos de seu próprio layout. O que nos interessa é parte da biblioteca padrão chamada distutils . Este é o cavalo de batalha, note que também existem ferramentas construídas sobre este (setuptools) e um fork chamado distribuir no momento tentando melhorar o empacotamento python.

Existe um patch importante que o fedora se aplica para falar aqui, o que faz tudo isso funcionar:

Este patch é aplicado condicionalmente na especificação do RPM para python em arquiteturas onde a lib lib é lib64:

Se olharmos como esses patches distutam:

diff -up Python-2.6/Lib/distutils/sysconfig.py.lib64 Python-2.6/Lib/distutils/sysconfig.py
--- Python-2.6/Lib/distutils/sysconfig.py.lib64 2008-06-05 08:58:24.000000000 -0400
+++ Python-2.6/Lib/distutils/sysconfig.py   2008-11-24 02:34:04.000000000 -0500
@@ -115,8 +115,12 @@ def get_python_lib(plat_specific=0, stan
         prefix = plat_specific and EXEC_PREFIX or PREFIX

     if os.name == "posix":
+        if plat_specific or standard_lib:
+            lib = "lib64"
+        else:
+            lib = "lib"
         libpython = os.path.join(prefix,
-                                 "lib", "python" + get_python_version())
+                                 lib, "python" + get_python_version())
         if standard_lib:
             return libpython
         else:

Agora temos uma condição em distutils que agora altera o que distutils.sysconfig.get_python_lib() retorna nos casos em que estamos perguntando sobre pacotes específicos da plataforma ou do sistema. Você pode experimentar isso com várias opções em um interpretador python:

Esta função é usada dentro de distutils - podemos ver na string doc o que ela faz:

Docstring:
    Return the directory containing the Python library (standard or
    site additions).

    If 'plat_specific' is true, return the directory containing
    platform-specific modules, i.e. any module from a non-pure-Python
    module distribution; otherwise, return the platform-shared library
    directory.  If 'standard_lib' is true, return the directory
    containing standard Python library modules; otherwise, return the
    directory for site-specific modules.

    If 'prefix' is supplied, use it instead of sys.prefix or
    sys.exec_prefix -- i.e., ignore 'plat_specific'.

Portanto, ao usar a construção de um pacote python usando distutils (ou as camadas construídas sobre ele), em algum momento solicitaremos à configuração do sistema onde o local correto para colocar os arquivos, dependendo se é um sistema ou plataforma lib ele vai na lib64 senão vai na lib.

Se você olhar para a documentação do Fedora Python Packaging ou usar a ferramenta fedora rpmdev para criar uma especificação de python esquelético rpmdev-newspec python-foo você verá comentários detalhados de como o fedora define variáveis para a compilação do rpm com base na chamada desta função.

    
por 27.11.2009 / 09:28