ubuntu 9.10:如何使用python lib-dynload和site-packages目录?

时间:2009-11-14 05:23:14

标签: python ubuntu install

在ubuntu 9.10中,在usr / lib /中有目录python2.4,python2.5,python2.6和python3.0

只有python 2.6才能正常工作 python2.4只有一个lib-dynload目录,
python2.5只有lib-dynload和site-packages,
python3.0只有一个dist-packages目录。

现在我想知道这背后的想法是什么? 因为当我使用./configure安装python2.5时,make,make install | altinstall 这进入了usr / local / lib而不是usr / lib /所以为什么这些目录添加了ubuntu,我应该如何安装python来使用它们呢?

4 个答案:

答案 0 :(得分:2)

j3ll3,在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都有一个。

Python2.6是Ubuntu 9.10中python的默认版本,但它也可以安装 python2.4,2.5和/或3.0。除非你这样做,否则只使用/usr/lib/python2.6/lib-dynload/gdbm.so,其他的只是浪费空间。

由于python2.4,2.5,3.0中不需要的文件不是很大,所以包维护者可能觉得为每个版本的python发送一个包而不是一个包更容易。

但是,除非您知道如何修复将来的apt-get错误,否则我建议手动删除Ubuntu中软件包安装的任何文件。

答案 1 :(得分:0)

听起来你已经安装了一些软件包,这是一个意外。

正在使用的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软件包,但它们不是同一类软件包。

答案 2 :(得分: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我绊倒了。我们谈了一会儿。 IIRC dist-packages与强制用户在 apt-get 的不同目录中安装软件包有关的原因。不过,我显然不明白动机,因为在实践中,用户和 apt-get 仍然安装在同一目录中。

lib-dynload不是Debian的东西;这是Python本身安装的目录。我相信它只是一个用于实现模块的共享库的目录。我不确定Python是否仍在使用它。

最后,我不知道你的意思是“只有python2.6实际上正在工作”。这些命名不同的目录怎么样“不工作”?

答案 3 :(得分: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实际上正在工作。”,那么有一件事要确保你确实为Python 2.4和Python 2.5安装了Ubuntu软件包。

% sudo apt-get install python2.4 python2.5

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