Кажется, у меня есть две папки 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 испортился.