fedora / usr / lib vs / usr / lib64

Il semble que j'ai deux python2.6 dossiers situés dans / usr / lib vs / usr / lib64 respectivement. La plupart des éléments de python (source) se trouvent dans /usr/lib64/python2.6 mais, lorsqu'ils sont installés, ils ont été mis dans /usr/lib/python2.6

Comment le système décide-t-il quel directory aller lorsque python est demandé, et comment il trouve le package que j'ai installé?

Toute source installée dans / usr / lib64 devrait être d'installer des packages src ou de développement qui, par défaut, sont choisis par votre architecture.

/ usr / lib ne doit avoir que des bibliothèques de 32 bits – de même / usr / lib64 devrait être une version de 64 bits. J'ai constaté que yum installerait occasionnellement des versions de 32 et 64 bits de certaines bibliothèques, et il y a des bibliothèques à ne pas être scopes à 64 bits. Si vous êtes une application particulière ou que la bibliothèque a été installée dans / usr / lib, soit pour satisfaire seulement une dépendance à l'aide de 32bit uniquement, soit une erreur de messagerie.

Cette réponse simple est que les packages créés sans aucune extension C / native devraient se terminer sous lib, ceux avec des extensions natives se refindont dans lib64 sur les systèmes multilib. En ce qui concerne la façon dont il trouve que les packages sont contenus dans sys.path – ceci provient d'un système 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 

La réponse plus détaillée sur la façon dont les packages arrivent nécessite un peu de compréhension de la façon dont Python fonctionne en termes de sa propre layout. Ce qui nous intéresse fait partie de la bibliothèque standard appelée distutils . C'est le cheval de bataille, notez qu'il existe également des outils embeddeds (setuptools) et une fourchette appelée dissortingbuer en ce moment essayant d'améliorer l'emballage python.

Il existe un patch important auquel fedora s'applique pour parler ici, ce qui fait que tout cela fonctionne:

  • python-2.6-lib64.patch

Ce patch est appliqué de manière conditionnelle dans la spécification RPM pour python sur les architectures où lib dir lib lib:

Si on regarde comment ces patchs distutil:

 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: 

Nous avons maintenant une condition sur distutils qui change maintenant ce que distutils.sysconfig.get_python_lib() returnne dans les cas lorsque nous posons des questions sur les packages système ou spécifiques à la plate-forme. Vous pouvez expérimenter l'appel de cela avec diverses options dans un interpréteur python:

Cette fonction s'utilise dans les distutils – on peut voir à partir de la string de documents ce qu'elle fait:

 Docssortingng: Return the directory containing the Python library (standard or site additions). If 'plat_specific' is true, return the directory containing platform-specific modules, ie any module from a non-pure-Python module dissortingbution; 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 -- ie, ignore 'plat_specific'. 

Donc, lorsque vous utilisez la construction d'un package python à l'aide de distutils (ou les couches construites sur le dessus), nous requestrons, à un moment donné, la configuration du système où est le bon endroit pour mettre les files, selon qu'il s'agit d'un système ou d'une plate-forme lib, Je vais dans lib64 sinon il ira dans lib.

Si vous regardez la documentation Fedora Python Packaging ou utilisez l'outil rpmdev Fedora pour créer une spécification python squelettique rpmdev-newspec python-foo vous verrez des commentaires détaillés sur la façon dont fedora définit les variables pour la rpmdev-newspec python-foo fonction de l'appel de cette fonction.