Назад | Перейти на главную страницу

Fedora / usr / lib против / usr / lib64

Кажется, у меня есть две папки python2.6, расположенные в / usr / lib и / usr / lib64 соответственно. Большая часть материала Python (исходный код) находится в /usr/lib64/python2.6, но в установленных пакетах они были помещены в /usr/lib/python2.6

Как система решает, в какой каталог перейти при запросе Python, и как она находит установленный мной пакет?

Этот простой ответ заключается в том, что пакеты, созданные без каких-либо расширений C / native, должны попадать в lib, а любые пакеты с собственными расширениями будут в lib64 в системах с несколькими библиотеками. Что касается того, как он находит пакеты, содержащиеся в sys.path - это из системы 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

Более подробный ответ о том, как туда попадают пакеты, требует некоторого понимания того, как работает python с точки зрения его собственного макета. Нас интересует часть стандартной библиотеки под названием Distutils. Это рабочая лошадка, обратите внимание, что на ее основе также есть инструменты (setuptools) и вилка под названием distribute, которая в настоящий момент пытается улучшить упаковку Python.

Есть важный патч, о котором в Fedora следует поговорить, и который заставляет всю эту работу работать:

Этот патч условно применяется в RPM спецификация для python на архитектурах, где каталог lib - lib64:

Если мы посмотрим, как это исправляет distutils:

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:

Теперь у нас есть условие для distutils, которое теперь меняет то, что distutils.sysconfig.get_python_lib() возвращается в случаях, когда мы спрашиваем о пакетах для конкретной платформы или системы. Вы можете поэкспериментировать с вызовом этого с помощью различных опций в интерпретаторе Python:

Эта функция используется в distutils - мы можем видеть из строки документа, что она делает:

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'.

Поэтому при создании пакета python с использованием distutils (или слоев, построенных поверх него) мы в какой-то момент спросим конфигурацию системы, где правильное место для размещения файлов, в зависимости от того, является ли это системой или платформой. Пойду в lib64, иначе он войдет в lib.

Если вы посмотрите на Документация Fedora Python Packaging или используйте инструмент fedora rpmdev для создания скелетной спецификации python rpmdev-newspec python-foo вы увидите подробные комментарии о том, как Fedora устанавливает переменные для сборки rpm на основе вызова этой функции.

Любой источник, устанавливаемый в / usr / lib64, должен быть связан с установкой пакетов src или devel, которые по умолчанию выбираются вашей архитектурой.

В / usr / lib должны быть только 32-битные библиотеки - аналогично / usr / lib64 должна быть 64-битной версией. Я обнаружил, что yum иногда устанавливает как 32-разрядные, так и 64-разрядные версии некоторых библиотек, и есть некоторые библиотеки, которые еще предстоит перенести на 64-разрядную версию, поэтому, если ваше конкретное приложение или библиотека установлены в / usr / lib, шансы, что это либо просто чтобы удовлетворить некоторые 32-битные зависимости приложений, либо yum испортился.