在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来使用它们呢?
答案 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 python
和python --version
;还有which python2.6
和which 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软件包。