Ubuntu9.10:如何使用Python的lib-dynload和site-packages目录?

3
在Ubuntu 9.10中,/usr/lib/目录下有python2.4、python2.5、python2.6和python3.0这些文件夹。但实际上只有python2.6是有效的。其中,python2.4只有一个lib-dynload目录,python2.5只有lib-dynload和site-packages目录,而python3.0只有一个dist-packages目录。
现在我想知道背后的原因是什么?因为当我使用./configure、make、make install | altinstall安装python2.5时,它会被安装到/usr/local/lib而不是/usr/lib。那么为什么Ubuntu添加了这些目录,我该如何安装python以便使用它们呢?
4个回答

2
在Ubuntu(或任何基于DPKG的Linux操作系统)中,您可以通过键入“提供 XYZ 的软件包是什么”来询问问题。
dpkg -S /path/to/XYZ

因此,例如在Ubuntu 9.10中,
dpkg -S /usr/lib/python2.5/lib-dynload/gdbm.so

返回值

python-gdbm: /usr/lib/python2.5/lib-dynload/gdbm.so

您可以通过输入以下命令了解有关python-gdbm软件包的更多信息:

apt-cache show python-gdbm

这段文字表明python-gdbm为Python提供了"GNU dbm数据库支持"。更有趣的是,如果您键入

dpkg --listfiles python-gdbm

你可以看到 Python-GDBM 安装的所有文件列表:
...
/usr/lib/python2.4
/usr/lib/python2.4/lib-dynload
/usr/lib/python2.4/lib-dynload/gdbm.so
/usr/lib/python2.5
/usr/lib/python2.5/lib-dynload
/usr/lib/python2.5/lib-dynload/gdbm.so
/usr/lib/python2.6
/usr/lib/python2.6/lib-dynload
/usr/lib/python2.6/lib-dynload/gdbm.so
...

这个单一的软件包安装了3个.so库,分别为每个Python版本提供一个。
在Ubuntu 9.10中,默认的Python版本是2.6,但也可以安装Python2.4、2.5和/或3.0。除非你这样做了,否则只有/usr/lib/python2.6/lib-dynload/gdbm.so会被使用,其他文件只是浪费空间。
由于Python2.4、2.5、3.0中不需要的文件并不是很大,因此软件包维护者可能认为最好是提供一个软件包,而不是为每个Python版本都提供一个软件包。
然而,如果您不知道如何修复未来的apt-get错误,我建议不要手动删除Ubuntu软件包安装的任何文件。

嗨~unutbu,这回答了我问题的第一部分,解释了这些文件来自哪里。太棒了! - Dan1ell
我的问题的第二部分已经被steveha回答了。感谢你们两个。 - Dan1ell

1

看起来它们是您安装的某些包的意外产物。

使用的Python版本确定了查找已安装的Python包/模块的位置,而Ubuntu 9.10中的“系统版本”Python为2.6,因此几乎所有内容都应该使用它。如果您安装了python2.5包(或它作为其他某些软件的依赖项被安装),那么它将使用 /usr/lib/python2.5/*。尝试运行which pythonpython --version;还有which python2.6which python2.5

据我所知,尽管我不确定原因,但Debian(从中衍生出Ubuntu)使用dist-packages命名方案,而不是site-packages

术语:Python具有软件包,而Debian(以及Ubuntu)具有软件包。它们不是相同类型的软件包,但单个Debian软件包将安装特定的Python软件包。


嗨,罗杰, 感谢你抽出时间。“听起来它们是你安装的某些软件包的意外结果。”这些软件包已经在干净的Ubuntu 9.10安装中存在,因此在我添加任何其他软件包之前就已经存在。它们随Ubuntu一起提供。 - Dan1ell

0

回答你的问题:当你从源代码安装软件包时,应该使用软件包的setup.py安装程序自动正确地安装它们。这个安装程序已经知道在哪里正确地安装模块,以便Python可以找到它们。要使用它,只需使用你想要与软件包一起使用的确切Python解释器进行调用。

setup.py的速成课程。首先,使用你想要使软件包可用的确切Python可执行文件运行它。如果你想要使用/usr/bin/python2.5与软件包一起使用,你应该使用/usr/bin/python2.5来运行setup.py。其次,进入该软件包的setup.py所在的目录。第三,你必须以root身份安装,因此最好整个过程都以root身份进行。第四,如果你想要安装到多个Python解释器,你应该使用每个解释器运行setup.py,但你应该在两者之间进行清理。所以这就是我会做的事情:

% cd /root/directory/of/untarred/source/package
% sudo su
# /path/to/first/python setup.py build install
# rm -rf build
# /path/to/second/python setup.py build install
# rm -rf build
# exit
%

如果你正在手动安装模块...你不应该这么做,而是应该使用它的setup.py。(如果你编写了一个新模块,你应该为其编写一个setup.py。) 如果你必须手动安装,你需要找出每个Python的正确目录来安装,可以通过探索和试验或调用与安装程序相同的库来确定正确的目录。使用distutils的安装程序调用distutils.sysconfig.get_python_lib();使用setup_tools的安装程序在setup_tools.command.easy_install.easy_install.INSTALL_SCHEMES[os.name]["install_dir"]中查找。

关于 dist-packages:我和今年早些时候 Debian 的 Python 包维护者进行了一次对话。他在 Ubuntu 9.04 上实现了这个 dist-packages,但是由于与 PYTHONUSERBASE 相关的代码有一个 bug,我遇到了问题。我们最后有点交流。我记得好像 dist-packages 的原因与强制用户在与 apt-get 不同的目录中安装包有关。但实际上,无论是用户还是 apt-get 都会将包安装到同一个目录中,所以我显然并不真正理解其动机。 lib-dynload 不是 Debian 特有的东西,它是 Python 自己安装的目录。我认为它只是一个包含模块实现共享库的目录。我不确定 Python 是否仍在使用它。
最后,我不知道你所说的“只有 python2.6 真正可用”是什么意思。这些不同命名的目录有什么“不工作”的地方吗?

谢谢你的解释,Harry。但是我问的是如何安装Python本身。事实证明,当从源代码构建时,默认情况下会进入/usr/local/lib/,而使用apt-get install安装时,则会进入/usr/lib/并使用已经存在的文件。感谢你提供的有关在构建其他软件包后清理自己的示例,这是我将开始养成的习惯。 - Dan1ell
我想看哈利的解释。 - Russ

0
我不确定你所说的“只有Python 2.6实际上可以工作”是什么意思。假设你运行“终端仿真器”并获得一个命令行提示符,这是你的意思吗?
% python -V
Python 2.6

换句话说,当你运行Python时,你得到的是2.6版本?那么,你试过这个吗:
% python2.4

如果您的系统上正确安装了Python 2.4,它将可以运行。同样,python2.5也可以运行Python 2.5。
如果这些无法运行,并且这就是你所说的"只有Python 2.6可以正常工作"的意思,那么一个尝试的方法是确保您实际上已经安装了Ubuntu的Python 2.4和Python 2.5软件包。
% sudo apt-get install python2.4 python2.5

如果您以前没有安装它们,这应该会添加它们。我的想法是,您可能有各种库来支持旧版本的Python,但您实际上没有这些旧版本的Ubuntu软件包。


嗨,Steveha, 感谢您的回复。是的,您的解释就是我所说的“工作”和“sudo apt-get install python2.4 python2.5”,已经在/usr/lib/中安装了两个Python版本,并在/usr/bin/中放置了正确的符号链接。现在我可以使用python2.4和python2.5启动解释器并执行.py文件。 - Dan1ell
这回答了我问题的第二部分,解释了如何将Python安装到/usr/lib/中。谢谢! - Dan1ell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接