似乎我有两个 python2.6 文件夹,分别位于 /usr/lib 和 /usr/lib64。大多数 python 内容(源代码)位于 /usr/lib64/python2.6 中,但在安装包中,它们被放入 /usr/lib/python2.6
当请求 python 时,系统如何决定去哪个目录,以及如何找到我安装的软件包?
答案1
安装到 /usr/lib64 的任何源都应来自安装 src 或 devel 包,默认情况下,这些包由您的体系结构选择。
/usr/lib 应该只有 32 位库 - 同样 /usr/lib64 应该是 64 位版本。我发现 yum 偶尔会安装某些库的 32 位和 64 位版本,并且有些库尚未移植到 64 位,因此如果您的特定应用程序或库已安装到 /usr/lib,那么很可能它只是为了满足某些仅 32 位应用程序的依赖关系,或者 yum 搞砸了。
答案2
这个简单的答案是,没有任何 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 自身布局的工作原理有一点了解。我们感兴趣的是标准库的一部分,称为分布式实用程序。这是主力,请注意,还有一些在此基础上构建的工具(setuptools)和一个名为distribute的分支,目前正在尝试改进python包装。
Fedora 应用了一个重要的补丁,这里要讨论的是这个补丁使得所有这些功能都可以正常工作:
此补丁在 RPM 中有条件应用规格对于 lib 目录为 lib64 的体系结构上的 python:
如果我们看一下这个如何修补 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'.
因此,当使用 distutils 构建 python 包(或在其上构建的层)时,我们会在某个时候询问系统配置放置文件的正确位置,取决于它是系统还是平台库,它将进入 lib64,否则它将进入 lib。
如果你看看Fedora Python 打包文档或者使用 fedora rpmdev 工具创建一个骨架 python 规范,rpmdev-newspec python-foo
您将看到有关 fedora 如何根据调用此函数为 rpm 构建设置变量的详细注释。