看来我有两个 python2.6 文件夹分别位于 /usr/lib vs /usr/lib64 。大多数 python 东西(源代码)在 /usr/lib64/python2.6 中,但是在安装的包中它们被放入 /usr/lib/python2.6
当请求 python 时,系统如何决定去哪个目录,以及它如何找到我安装的打包的?
看来我有两个 python2.6 文件夹分别位于 /usr/lib vs /usr/lib64 。大多数 python 东西(源代码)在 /usr/lib64/python2.6 中,但是在安装的包中它们被放入 /usr/lib/python2.6
当请求 python 时,系统如何决定去哪个目录,以及它如何找到我安装的打包的?
这个简单的答案是,在没有任何 C/native 扩展的情况下构建的包应该在 lib 下结束,任何具有原生扩展的包都将在 multilib 系统上的 lib64 下结束。至于它如何找到包含在 sys.path 中的软件包 - 这是来自 x86_64 F-11 系统:
关于包如何到达那里的更详细的答案需要对 python 在其自身布局方面的工作方式有所了解。我们感兴趣的是名为distutils的标准库的一部分。这是主力,请注意,在此基础上还构建了一些工具(setuptools)和一个名为distribute的分支,目前试图改进python打包。
Fedora 适用于在这里谈论的一个重要补丁,它使所有这些工作:
此补丁有条件地应用于lib 目录为 lib64 的架构上的 python的 RPM规范:
如果我们看一下 distutils 是如何修补的:
我们现在对 distutils 有一个条件,
distutils.sysconfig.get_python_lib()
当我们询问特定平台或系统包时,它现在会更改返回的内容。您可以尝试在 python 解释器中使用各种选项调用它:这个函数在 distutils 中使用——我们可以从文档字符串中看到它的作用:
因此,当使用 distutils(或在其之上构建的层)构建 python 包时,我们会在某个时候询问系统配置文件放置的正确位置,具体取决于它是系统库还是平台库。将进入 lib64,否则它将进入 lib。
如果您查看Fedora Python 打包文档或使用 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 搞砸了。