在RHEL 8中使用Python
10年前,Python开发者社区决定对Python语言做一个系统性的清理,于是他们发行了一个向后不兼容的Python新版本——Python 3。显然,初期的社区开发者低估了他们这次改动的影响,也低估了Python语言的流行度。不过,在过去的10年当中,绝大部分的社区项目还是迁移到了新的Python版本,并且他们当中大多数已经放弃了对Python 2的支持。
在红帽Linux 8企业版(以下简写为RHEL 8)中,Python 3.6已经是默认的设置了,但是RHEL 8中仍然支持Python 2。
在RHEL 8中使用Python
安装Python,你可以输入命令 yum install python3。
运行Python,你可以输入命令 python3。
如果这样不成功,或者你需要更多详细信息,那么请接着往下看!
Python 3
在RHEL 8中,Python 3.6是默认的、完全支持的Python版本,但跟系统中的其它工具一样,它并非总是默认安装的。你可以使用命令 yum install python3 来安装它。
通常情况下,附带的安装包名字是有"python3"前缀的。你可以使用命令 yum install python3-requests 来安装流行而出名的HTTP请求处理的工具包requests。
Python 2
并非所有的软件/程序都做好了能在Python 3下运行的准备。不过关系不大, RHEL 8仍然自带Python 2 栈,并且它可以跟Python3一起同时被安装在系统中。你可以使用命令 yum install python2 来安装Python 2, 然后使用命令 python2 来运行Python 2
为啥不干脆统一成 "Python" ?
好的,好的,现在我们已经同时有了 python3 和 python2 这2个命令了,但是如果我就是想用 python 呢? 呃,试一下...
然鹅,系统默认下,并没有一个叫做 python 的命令啊。
这是为啥呢?坦率地说,是因为我们没法就 python 这个命令具体表示什么达成一致意见。开发者社区有2大阵营。其中一派期望python 命令表示Python 2,而另一派却希望表示Python 3。两大阵营的人不是很经常跟对方沟通,所以你可能会成为其中一个阵营的成员而对另外一个阵营的人一无所知——但实际上他们的确存在。
现在,已经是2018年了,认同 python == python2 的人越来越多,即使是在那些更喜欢使用Python 3的人中也是如此(这类人会清晰地用python3来指代Python 3)。认同 python == python2 也已经得到了Python官方上游建议的支持——PEP 394。然而,我们期望这个观点在RHEL 8的流行期内变得越来越不流行,因为让 python 一直指代Python 2,Red Hat将会使自己陷入困境。
无版本的Python命令
就是说,有一些应用程序期望存在这么一个python命令,并且这种设想很难去改变它,即确实存在这种场景。这就是为啥你可以使用alternatives机制在系统层面激活这个无版本的 python 命令并将它设置成一个指定的Python版本:
同理,如果是Python 2,上述命令可以相应改成 /usr/bin/python2。如果你想知道如何撤销这种修改或者想知道如何交互式地进行设置,请使用 man unversioned-python 命令了解详情。
需要注意的是,我们不推荐使用这种方式。我们还是推荐你显式地指定 python3 或者 python2 命令。因为只有这样,你的Python脚本才可以在任何一台正确安装了Python的机器上运行而不报错。
需要注意的是,这种方式,只对 python 这个命令本身有效。安装包或者其他的命令并没有相应地配置过无版本。所以即使你配置好了 python 命令,yum install python-requests 命令或者 pip 命令也还是不能工作,已Python 3为例,你需要相应的使用 yum install python3-requests 或者 pip3。
请记住在这些情况下,尽量使用显示的版本。最好也不要依赖pip,venv这类命令和其他你可以从命令行调用的Python命令的包装脚本。相应地,请使用 python3 -m pip, python3 -m venv, python2 -m virtualenv 这种显式指定Python版本的命令。
第三方的包
并非所有Python相关的包都默认安装在RHEL 8——只有那些能被Red Hat验证,打包以及支持的才会被默认安装在系统中。
网上很多建议你使用sudo pip install命令来安装一个Python的第三方包。千万不要这么做!这个命令真正的意思是"从网上下载一个安装包,并在我的机器上使用root身份去安装它"。
即使这个第三方的安装包是值得信赖的,这么做也是一个坏主意。RHEL 8很大一部分功能依赖Python 3.6。如果贸然给系统安装了一个第三方包,你没办法保证它可以跟系统中其他的软件包工作地很好。虽然操作系统在某些层面会自带一些防护措施,不过你最好还是要有sudo pip会破坏你的系统这样的意识。(更别提实际上sudo pip根本不会按照你预想的那样工作,正确的命令的是pip3或者pip2。 )
如果你希望使用第三方的安装包,你可以使用python3 -m venv --system-site-packages myenv命令创建一个虚拟环境(或者Python 2的话,相应地需要安装python2-virtualenv,并且命令为python2 -m virtualenv --system-site-packages myenv),然后,使用source myenv/bin/activate命令激活这个虚拟环境,最后可以使用pip install命令往虚拟环境中安装需要的包。做完这些操作之后,安装包应该就已经被安装在了虚拟环境中了,前提是虚拟环境已经被激活了。虽然这种方式无法保护你不受可疑安装包的侵害,但它却可以保护操作系统免受意外的破坏。
一个虚拟环境被激活后,诸如python和pip这类无版本的命令将会指代创建虚拟环境的Python版本。所以,要安装第三方包Requests,可以直接使用命令pip install requests来安装。(如果你比较喜欢显式指定的话,可以使用python -m pip install requests)。
命令中的--system-site-packages开关选项允许你的多个虚拟环境在系统层面可以重用安装包,假如你希望的是一个完全隔离的环境,那么请去掉这个选项开关,不过那样的话,所有Python标准库之外的第三方库你都需要显式地安装它们。
还有另外一种情况,就是可以使用--user开关选项,安装用户相关的包。比如python3 -m pip install --user flake8这个命令将会让Python的代码校验工具flake8只为你这个用户安装,从而不会影响系统中的其他工具,比如`yum`。
万一你真的需要在整个系统层面安装一些包或者软件,建议你可以构建一个RPM的包,然后使用命令yum install来安装到系统层面。
须知:使用`pip`安装的第三方安装包没有经过Red Hat的审核和支持。
Platform-Python:隐藏的Python
细心的读者可能已经发现了其中有个"问题":既然Python并非系统默认安装,yum是系统默认安装,而yum是由Python编写的,这到底是怎么回事呢?
事实上,操作系统中存在一个隐藏的内部Python解释器叫做"Platform-Python"。这也是很多系统工具所使用的python。与正常的Python不同的是,它只包含了一些运行系统所必须的最小Python功能,所以无法保证其中哪些特性会在将来被移除。
然而,Platform-Python的库是与对用户可见的Python 3.6共享的。这样可以节省磁盘空间,并且这也意味着使用Python 3.6编译的yum扩展也可以在其他系统工具中正常工作。
如果你不是重新构建发行版,请务必不要直接使用Platform-Python,建议你去安装一个python3然后用phthon3吧。
迁移至Python 3
虽然并不会是在RHEL 8中,但是终会有一天Python 2将不再得到社区和官方的支持。如果你还有Python 2的代码在维护,你最好考虑一下将它迁移至Python 3。
Python 3在2008年第一次发行。在超过10年的发展中,Python 3不论是在自身特性上,还是在性能——甚至有点讽刺地说即使是在对Python 2的兼容性方面均有很大的改进和提升。你或许之前有听说过将遗留代码迁移至Python 3.0或者 3.2是多么恐怖的一件事情,不过现在这件事已经变得没那么吓人了。
当然,我并不是说迁移至Python 3不重要,但是它显然已经变得比之前容易太多了。就像其他对系统的修改一样,迁移至Python 3需要的仅仅是你的代码库,充足的测试,以及——一些时间而已。
那么,迁移到Python3有什么好处? Python 3是一个相对更好的语言——毕竟,它是连 Python 2的开发人员都在用的编程语言!对于企业级的应用,Python 3 最主要的特性就是可以降低难调试的风险,以及在处理非ASCII字符型文本时的输入Bug,比如人名(或者表情)。
社区有很多资源和文档可以帮助你迁移到Python 3。
如果你正在阅读这篇博文,那很可能你正在使用一个大型、保守陈旧的代码库。针对这种情况,我们总结了一些自己的精华经验在这里:《The Conservative Python 3 Porting Guide》(https://portingguide.readthedocs.io/en/latest/),它是一篇手把手教你关注兼容性并且在整个的迁移过程中保持代码始终是工作的。建议你不妨试一试,如果你发现哪些文章中没有覆盖到,欢迎联系我们——你甚至可以直接在GitHub上提merge request。
如果你在维护Python C的扩展,推荐你看一下这个精华的手册,它来自py3c项目(https://py3c.readthedocs.io/en/latest/)的一部分.
知识点总结
在RHEL 8中安装或使用Python,请使用python3—— 除非你脑子里想的是其他版本。
- 千万不要使用sudo pip。
- 千万不要在你的应用中使用系统自带的platform-python。如果你是在为RHEL 8编写系统/管理层面的代码,那另当别论。
- 当然,如果你仍然还有一些Python 2的遗留代码,那么现在将是为它们开始“现代化”的最好时机啦。
最后,祝你们在RHEL 8中愉快地使用Python!
英文原文:https://developers.redhat.com/blog/2018/11/14/python-in-rhel-8/
译者:Zoe