我更改了 Python 版本 - 但它并没有“应用”到所有地方?

我更改了 Python 版本 - 但它并没有“应用”到所有地方?

免费的 Ubuntu 用户。我遇到了一个奇怪的问题,我花了一段时间尝试调试它,后来我彻底搜索了相关数据,但毫无收获。

我有一台运行 Lucid Lynx 的相当新的服务器,我正在尝试将默认 Python 版本切换为 2.7。我已经测试了我正在运行的所有应用程序,它们似乎在 2.7 上运行良好 - 而且它不是任务关键型服务器,因此如果我愿意,我可以失败并退出。

我做了功课,安装了 2.7,更改了 /usr/bin 中的软链接,并编辑了我的 /usr/share/python/debian_defaults,使默认版本为 python2.7。然后,我尝试在命令行中为“root”和“某个随机用户帐户”输入“python”,得到了 python 2.7,然后重新开始工作。

这是几个月前的事了,直到今天一切都很顺利……

我尝试运行 Python 守护程序 - 但它总是莫名其妙地失败。我追踪到它是由于未安装的软件包 - 但......

经过一些调试后,我发现实际上当我将 Python 脚本作为守护进程运行时,它运行的是 Python 2.6.5 - 但如果我从命令行运行相同的脚本,它运行的是 Python 2.7.2 - 而且我当然还没有安装 Python 2.6 的新库。 (我正在使用 Python 守护进程库将脚本作为守护进程启动...)

但是我的脚本全部以 #!/usr/local/bin/python(我最近安装的版本)开头,并/usr/local/bin/python --version返回 2.7.2。事实上,我更改了 #! 行以明确指向 python 2.7,它仍然以完全相同的方式失败。

后来我发现如果我在 pdb(python 调试器)中运行该程序,我也会得到 2.6 版本。

我认为关键是 pdb 和守护进程运行器都没有注意到 #! 行 - 但我无法再进一步了。

我们衷心感谢你的帮助。

编辑:下面有一些很好的建议 - 如果我的 Stackoverflow 因缘到达这里,我会赞成它们 - 但效果不佳(见下面的评论)。解决方案:转储 Python 2.6。

答案1

尝试sudo update-alternatives --config python

Ubuntu/Debian 有一个替代系统,用于处理多个程序执行相同操作的情况。man 8 update-alternatives有关更多信息,请参阅。

答案2

我没有灵丹妙药,但我有几个建议。当我运行以下命令时:

$ ls -al /usr/bin/pdb*

我得到了这个(我在 Ubuntu 11.10 上):

lrwxrwxrwx 1 root root  6 2012-02-16 20:53 /usr/bin/pdb -> pdb2.7
lrwxrwxrwx 1 root root 23 2012-02-01 09:17 /usr/bin/pdb2.5 -> ../lib/python2.5/pdb.py
lrwxrwxrwx 1 root root 23 2011-08-11 06:04 /usr/bin/pdb2.6 -> ../lib/python2.6/pdb.py
lrwxrwxrwx 1 root root 23 2012-02-16 20:53 /usr/bin/pdb2.7 -> ../lib/python2.7/pdb.py

因此对于 pdb,您可能需要更改符号链接。

您也可以尝试这个命令(如果您的机器上尚未安装,则 update-alternatives 位于存储库中):

sudo update-alternatives --config python

这应该可以明确您的默认 Python 版本是什么,并允许您重置它。

最后,还有 virtualenv 和 python-brew,用于明确控制在具有多个版本的系统上运行的 python 版本。我没有使用过 python-brew,但我确实喜欢 virtualenv 软件包整齐地打包 python 环境的方式。如果您不熟悉它,这篇文章可能会引起您的兴趣:

http://mirnazim.org/writings/python-ecosystem-introduction/

答案3

我假设你正在尝试让 upstart 与你的 python 升级配合良好。你试过了吗/usr/bin/python /opt/myservice.py?正如其他人已经提到的,update-alternatives 是你应该使用的方法。但他们可能没有将它应用于 upstart。

答案4

哎呀。你正在走出可以改变的世界,而不会造成严重破坏:)

是的,您可以毫无困难地在 中编译和安装任何您想要的 Python /usr/local。如果您希望其中一个作为命令python,您也可以这样做,只需在 中放置这样的符号链接即可/usr/local/bin/

您确实不想接触/usr/share/python/debian_defaults或弄乱任何符号链接/usr/bin

您是否正在运行 upstart 的守护进程?/usr/local/bin可能不在您的守护进程中PATH

相关内容