web-dev-qa-db-ja.com

fedora / usr / libと/ usr / lib64

/ usr/libと/ usr/lib64にそれぞれ2つのpython2.6フォルダーがあるようです。ほとんどのpythonもの(ソース)は/usr/lib64/python2.6にありますが、インストールされたパッケージにある場合は/usr/lib/python2.6に配置されています

pythonが要求されたときに、システムがどのディレクトリに移動するかを決定する方法と、インストールされているパッケージを見つける方法を教えてください。

4
Weiwei

/ usr/lib64にインストールされるソースは、デフォルトでアーキテクチャによって選択されるsrcまたはdevelパッケージのインストールからのものである必要があります。

/ usr/libには32ビットライブラリのみが必要です。同様に、/ usr/lib64は64ビットバージョンである必要があります。 yumは、一部のライブラリの32ビットバージョンと64ビットバージョンの両方をインストールすることがあります。また、64ビットに移植されていないライブラリもあるため、特定のアプリまたはライブラリが/ usr/libにインストールされている場合はオッズが32ビットのみのアプリの依存関係を満たすためだけか、yumがめちゃくちゃになっています。

1
DisabledLeopard

この簡単な答えは、C /ネイティブ拡張なしでビルドされたパッケージは最終的にlibの下に置かれるべきであり、ネイティブ拡張を持つパッケージは最終的にmultilibシステムのlib64になるということです。パッケージの検索方法については、sys.pathに含まれています-これはx86_64F-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)と、pythonパッケージングを改善しようとしている現在distributeと呼ばれるフォークもあることに注意してください。

Fedoraがここで話すために適用する重要なパッチがあり、これがすべてを機能させます。

このパッチは、libディレクトリがlib64であるアーキテクチャのpythonのRPM spec に条件付きで適用されます。

このパッチがどのように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内で使用されます-doc文字列からそれが何をするかを見ることができます:

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

したがって、distutils(またはその上に構築されたレイヤー)を使用してpythonパッケージを構築する場合、ファイルを配置する適切な場所がどこにあるかをシステム構成に尋ねます。システムまたはプラットフォームライブラリはlib64になり、それ以外の場合はlibになります。

Fedora Pythonパッケージドキュメント を見るか、Fedorarpmdevツールを使用して骨格のpython spec _rpmdev-newspec python-foo_を作成すると、その方法に関する詳細なコメントが表示されます。 Fedoraは、この関数の呼び出しに基づいてrpmビルドの変数を設定します。

7
user9939