向下兼容特性是软件开发系统的一个重要指标,它是指一个新的系统或者软件能够与旧的系统或软件兼容并正常运行。这意味着旧系统或软件可以在新系统或软件中使用,而不会出现问题。向下兼容对于提高软件或系统的可用性非常重要,因为它允许用户在不更换旧系统或软件的情况下使用新系统或软件。

我们知道MacOS系统从Monterey12.3版本起就移除了系统内置的Python2,更不消说最新的Ventura13.1了,但有时候我们依然需要古早版本的Python2.x来维护或者更新一些“祖传项目”,不得不承认,这类低版本的“祖传项目”在各种中大型企业内可谓是层出不穷,那么在最新的Ventura13.1系统中,就得重新安装Python2版本。

Docker构建Python2

最简单的方式是通过Docker镜像来构建Python2开发环境,通过使用容器,开发者可以轻松地将开发环境与应用程序隔离开来,这有助于避免依赖冲突和版本混乱。

直接拉取Python2的Docker镜像文件:

docker pull python:2.7.18-slim-stretch

随后运行进入Python2命令行:

docker run -it --name python2 python:2.7.18-slim-stretch

程序返回:

➜  qiniu_async docker run -it --name python2 python:2.7.18-slim-stretch
Python 2.7.18 (default, Apr 20 2020, 20:08:54)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

当然了,构建开发环境并非只需要开启命令行,还需要通过pip安装一些古早版本的三方依赖,此时退出Python2命令行:

exit()

随后查看Python2的容器id

➜  ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41ef4af5169d python:2.7.18-slim-stretch "python2" 8 minutes ago Up 5 minutes python2
➜ ~

进入容器内终端:

docker exec -it 41ef4af5169d /bin/sh

此时,就可是使用pip命令来安装一些老版本的软件了,比如说Django:

pip install django@1.11.29

程序返回:

DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting django
Downloading Django-1.11.29-py2.py3-none-any.whl (6.9 MB)
|████████████████████████████████| 6.9 MB 8.9 MB/s
Collecting pytz
Downloading pytz-2022.7-py2.py3-none-any.whl (499 kB)
|████████████████████████████████| 499 kB 20.7 MB/s
Installing collected packages: pytz, django
Successfully installed django-1.11.29 pytz-2022.7
WARNING: You are using pip version 20.0.2; however, version 20.3.4 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
# pip list
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Package Version
---------- -------
Django 1.11.29
pip 20.0.2
pytz 2022.7
setuptools 44.1.0
wheel 0.34.2

安装成功后,退出容器,然后提交更改:

# exit
➜ qiniu_async docker commit 41ef python:2.7.18-slim-stretch
sha256:119b30be68c806bdd4c74ffa3da115ba6ab144a91664a13e728c529c1fd5bca8

如此,就算容器被销毁,再次通过镜像启动容器,也可以保留安装的老版本软件。

HomeBrew安装虚拟环境构建Python2

如果不想使用Docker,也可以考虑Python虚拟环境,它是在主机操作系统之上的一个独立的目录,其中包含一套完全独立的Python解释器和一组库和软件包。它可以在不影响其他项目的情况下,为单个项目创建一套特定的运行环境。

首先安装HomeBrew:

/bin/zsh -c "$(curl -fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”

随后执行清理和升级:

brew cleanup && brew update

安装虚拟环境:

brew install pyenv

随后安装需要的Python2版本:

pyenv install 2.7.18

接着添加环境变量:

echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc

之后就可以开启虚拟环境了:

pyenv init

注意重启终端后,就可以切换Python版本了:

pyenv shell 2.7.18

结语

Docker容器和Python虚拟环境都可以让MacOs系统做到向下兼容开发和维护古早项目,虚拟环境主要用于在同一台机器上管理多个Python项目的依赖关系,而Docker容器则更适用于在不同的机器之间迁移应用程序和环境,可以在任何支持Docker的机器上运行该容器,而无需考虑底层操作系统的差异。

旧酒换新瓶,新版M1/M2芯片Macos(Ventura)安装古早版本Python2.7(Python2.x)的更多相关文章

  1. Service Mesh 是新瓶装旧酒吗?

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 李云(花名: ...

  2. 极光开发者沙龙 之 移动应用性能优化实践 【一】旧酒新瓶——换个角度提升 App 性能与质量

    旧酒新瓶--换个角度提升 App 性能与质量 主讲人:高亮亮 ---   饿了么移动技术部高级iOS工程师,负责饿了么商家版iOS APP开发,对架构和系统底层有深入研究,擅长移动性能分析,troub ...

  3. C# 酒鬼买酒喝,瓶盖和空瓶子可以换新的酒

        using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  4. 软件工程M1/M2总结

    也不分M1/M2了,就从头到尾的梳理一下这学期的软工课吧. 第一节课,老师就稀里哗啦说了一下这学期要怎么搞,什么个人项目啦,结对项目啦,团队项目一二啦,还要组队啊什么的,然后风风火火的组队. 个人项目 ...

  5. 蓝桥杯试题利用数学知识经典解法,1.三个空瓶子换一瓶水;2.猜最后一个字母——猎八哥FLY

    本博客为本人原创,转载请在醒目位置表明出处. 1.乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下 去,但不允许赊账.请你计算一下,如果小明不浪 ...

  6. 【个人阅读】软件工程M1/M2阶段总结

    这次作业是好久以前布置的,由于学期末课程设计任务比较重,我在完善M2阶段的代码的同时又忙于数据库的实现和编译器的实现,一度感觉忙得透不过气来....到这些都基本完成的时候,会看自己以前的阅读心得,觉得 ...

  7. 【个人阅读】软件工程M1/M2做一个总结

    1.以前博客链接 http://www.cnblogs.com/penglinjiang/p/4027850.html http://www.cnblogs.com/penglinjiang/p/40 ...

  8. 软件工程M1/M2总结及阅读作业总结

    一.软件工程M1/M2总结 写下这篇总结的时候,我们的软件项目尚未完工.虽然尝试申请了延期答辩,但最终未能成功.这意味着,我们的项目能否正常发布已经处于了一个微妙的状态.可能可以,也可能不可以.只能尽 ...

  9. M1/M2项目阶段总结

    1.M1/M2总结 我们这学期完成了学霸项目. 在M1阶段,我们首先进行了分工,完成了一个系统的计划,然后是对学长代码的移植和优化.在优化代码的过程中,我们遇到了不少问题,比如一些代码的冗余以及指向性 ...

  10. 个人阅读作业 --软件工程M1/M2总结

    软件工程M1/M2总结 写在前面的话: 这学期的软件工程伴着考期的展开逐渐落下帷幕,回顾这学期的软件工程,我感觉我的热情在一次又一次的失落中逐步消耗殆尽,每个人对于这门课的体验都会有所不同吧,可以确定 ...

随机推荐

  1. 关于Struts访问不到静态资源的问题

    今天重新配置了Struts的项目进行开发,但是项目静态资源一直访问不到. 将一些静态资源放在WebRoot下的static包下面便于管理. 一开始以为采用拦截.do,只拦截do后缀的请求,解决了静态资 ...

  2. 齐博x1标签实例:标签如何调用论坛内容

    论坛的内容不像CMS其它模块可以直接用变量 {$rs.content} 因为论坛的内容数据表是放在另一个表的,单独分开的. 当前也是为了考试效率问题而这样设计的. 所以他的调用要用下面的代码 {:fu ...

  3. 知识图谱顶刊综述 - (2021年4月) A Survey on Knowledge Graphs: Representation, Acquisition, and Applications

    知识图谱综述(2021.4) 论文地址:A Survey on Knowledge Graphs: Representation, Acquisition, and Applications 目录 知 ...

  4. webscraper 无代码爬虫

    官网:https://www.webscraper.io/web-scraper-first-time-install webscraper 简介 Web Scraper 是一款免费的,适用于普通用户 ...

  5. JS 学习笔记 (七) 面向对象编程OOP

    1.前言 创建对象有很多种方法,最常见的是字面量创建和new Object()创建.但是在需要创建多个相同结构的对象时,这两种方法就不太方便了. 如:创建多个学生信息的对象 let tom = { n ...

  6. Java安全之动态加载字节码

    Java字节码 简单说,Java字节码就是.class后缀的文件,里面存放Java虚拟机执行的指令. 由于Java是一门跨平台的编译型语言,所以可以适用于不同平台,不同CPU的计算机,开发者只需要将自 ...

  7. perl中ENV的使用

    在打印环境变量的时候可以用到.实际上是%ENV,perl中的哈希变量,里面保存的是环境变量.键是环境变量名,值是环境变量值.例如,有一个环境变量是PATH,其值为C:\windows,那么,打印这个环 ...

  8. zephyr的GPIOTE驱动开发记录——基于nordic的NCS

    简介: 本次测试了zephyr的中断驱动方式(GPIOTE),在这可以去看zephyr的官方文档对zephyr的中断定义,连接如下,Interrupts - Zephyr Project Docume ...

  9. HDLBits答案——Circuits

    1 Combinational Logic 1.1 Basic Gates 1.1.1 Exams/m2014 q4h module top_module ( input in, output out ...

  10. 用最少的代码模拟gRPC四种消息交换模式

    我们知道,建立在HTTP2/3之上的gRPC具有四种基本的通信模式或者消息交换模式(MEP: Message Exchange Pattern),即Unary.Server Stream.Client ...