当前位置: 首页 > 编程日记 > 正文

python2与python3转换记录

为什么需要有两个版本的Python

Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发。Linux的许多发行版本(如Ubuntu)都会自带Python2.7,但是当我们准备开发一个Python3项目的时候,Linux下确实是可以两个一起装的,但是问题是你怎么切换两个版本的Python?

01 修改别名

查看一下我们的默认Python版本

$ python --version
Python 2.7.6

然后我们修改一下别名

$ alias python='/usr/bin/python3'
$ python --version
Python 3.4.3  # 版本已经改变

/usr/bin/python3 这个路径是怎么找到的呢?

一般来说,软件的二进制文件都可以在 /usr/bin 或 /usr/local/bin (这个优先级高一点)找到。当然如果你是Debian系的Linux,可以这么找(前提是你已经安装了Python3):

$ dpkg -L python3

上面的别名修改只是暂时性的,重开一个窗口后配置就不见了。如果要使每个窗口都使用这个别名,可以编辑 ~/.bashrc (如果你是别的shell的话,就不是这个文件,如zsh是 ~/.zshrc ),把alias配置写入文件。

修改别名优点是足够简单,但是切换不灵活。

0x02 链接文件

在 /usr/bin 中建立一个链接文件指向Python3。

$ ln -s python /usr/bin/python3
$ python --version
Python 3.4.3

跟修改别名一样,也是修改不够灵活。

03 采用update-alternatives 切换版本

update-alternatives是Debian提供的一个工具(非Debian系的就不用看了),原理类似于上面一个办法,也是通过链接的方式,但是其切换的过程非常方便。

首先看一下update-alternatives的帮助信息:

$ update-alternatives --help
用法:update-alternatives [<选项> ...] <命令>

我们仅需要了解3个参数就行了

  • --install <链接> <名称> <路径> <优先级> :建立一组候选项
  • --config <名称> :配置 <名称>组中的可选项,并选择使用其中哪一个
  • --remove <名称> <路径> :从 <名称> 中去掉 <路径>选项

首先我们先看一下有没有关于Python的可选项:

$ update-alternatives --display python
update-alternatives: 错误: 无 python 的候选项

那首先先建立python的组,并添加Python2和Python3的可选项

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2 # 添加Python2可选项,优先级为2
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1 #添加Python3可选项,优先级为1

注意,这里的 /usr/bin/python 链接文件,两个可选项必须是一样的,这样这个链接文件才可以选择两个不同的可选项去链接。

这时如果我们查看 /usr/bin/python 这个文件时,会发现它已经链接到了 /etc/alternatives/python 。

lrwxrwxrwx 1 root root        24  6月 19 18:39 python -> /etc/alternatives/python

然后我们再看一下版本

$ python --version
Python 2.7.6

为什么还是Python2,看一下配置

$ sudo update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。选择       路径              优先级  状态
------------------------------------------------------------
* 0            /usr/bin/python2.7   2         自动模式1            /usr/bin/python2.7   2         手动模式2            /usr/bin/python3.4   1         手动模式
要维持当前值[*]请按回车键,或者键入选择的编号:

原来是因为默认选中了自动模式,而Python2的优先级高于Python3,这时候只要键入2,就可以使用Python3了。

如果你想要删除某个可选项的话:

$ sudo update-alternatives --remove python /usr/bin/python2.7

update-alternatives只适用于Debian系Liunx。

04 virtualenvwrapper 切换版本

virtualenvwrapper是管理Python虚拟环境的工具,可以很方便的为不同的项目建立独立的环境,每个项目都可以安装自己的依赖,同时也支持在不同的虚拟环境中存在不同版本的Python。

首先安装virtualenvwrapper,可以选择apt安装或者pip安装

apt安装

$ sudo apt-get install virtualenvwrapper

pip安装

$ sudo pip install virtualenvwrapper

当你需要使用Python2开发项目时,建立一个Python2的虚拟环境:

$ mkvirtualenv -p /usr/bin/python2 env27

当你需要Python3开发时:

$ mkvirtualenv -p /usr/bin/python3.4 env34

然后可以随时切换不同的虚拟环境:

$ workon env27  # 进入Python2环境
$ workon env34  # 进入Python3环境

更爽的是,你可以在进入虚拟环境的同时切换到项目目录,只需要编辑 $VIRTUAL_ENV/bin/postactivate 这个文件即可:

$ vim $VIRTUAL_ENV/bin/postactivate  #前提是已经进入对应的虚拟环境

在文件中添加切换目录的命令:

cd  /path/to/your/project

05 总结

前面两种方法不推荐使用。

使用 update-alternatives 切换版本只适用于Debian系的Linux。

推荐使用 virtualenvwrapper 来管理虚拟环境和版本。

另外,本文介绍的切换不同版本软件的方法,除了 virtualenvwrapper 之外,前面3种方法都适用于其他软件,比如Java(open-jdk和oracle-jdk)

part 2:Anaconda实现python2与python3版本切换

如果你已经安装了Anaconda Python3.6版,想要再安装Python2.7环境,在命令行中输入:

conda create -n python27 python=2.7

想要使用python2.7环境同样需要命令source activate python27(这里面的python27是前面create时自己定义的名字),该条命令在linux和mac环境中使用 source activate python27 。接下来看到命令行的最前端多出来(python27),这时候已经处在python2.7的环境中了。想要退出python2.7进入python3.6,需要再次键入命令deactivate(linux和mac下用source deactivate命令)。

参考博客:

【1】https://blog.csdn.net/justdoithai/article/details/70310095

【2】https://www.cnblogs.com/zl1991/p/9041554.html

【3】https://blog.csdn.net/jainszhang/article/details/80345928

相关文章:

oracle读书笔记之Oracle 11g R2 DBA操作指南(前三章)

Oracle 11g R2 DBA操作指南是我学习的第一本讲述oracle数据库知识的书籍&#xff0c;在此记录下自己的学习笔记&#xff0c;对于书中的知识点本人通过实际操作进行验证。1.Oracle数据库基础1.1.关系数据库1.1.1.关系数据库模型1.关系数据库模型三个核心概念&#xff1a;关系、属…

【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)

https://vjudge.net/problem/UVA-11991 题目大意&#xff1a;就是给你一个序列&#xff0c;然后给出k和v&#xff0c;看整数v第k次出现在该序列的什么位置&#xff0c;没有的话就输出0 结构体&#xff08;略复杂&#xff09;&#xff1a; #include <iostream> #include…

面试题:2018最全Redis面试题整理

1、什么是Redis?Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a;Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次…

Android5.0如何正确启用isLoggable(二) 理分析

转自&#xff1a;http://www.it165.net/pro/html/201506/43374.html 概要 在上文《Android 5.0 如何正确启用isLoggable(一)__使用详解》中分析了isLoggable的使用方法&#xff0c;本文主要分析isLoggable实现原理以及user版系统root后永久enable isLoggable的原理&#xff0c;…

SLAM精度测评——rpg_trajectory_evaluatio

1. install https://github.com/ccxslam/rpg_trajectory_evaluation#install 下载catkin_simple&#xff1a;https://github.com/catkin/catkin_simple 建立工作空间 src下载&#xff0c;编译&#xff0c;然后下载rpg_trajectory_evaluatio,编译安装即可。 &#xff12;&a…

STL set multiset

STL容器大的方向分为两类&#xff0c;序列式容器和关联式容器。 这两者通过数据在容器内的排列来区分。关联容器和顺序容器的根本不同在于&#xff1a;关联容器中的元素是按关键字来保存和访问的&#xff0c;而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的。 …

Windows 消息循环(1) - 概览

本文从消息循环是如何驱动程序的这个角度&#xff0c;对 Windows 消息循环进行概览性介绍。 使用 EN5 课件获得更好的阅读体验&#xff1a; 【希沃白板5】课件分享 : 《Windows培训 - 消息循环》https://r302.cc/q2d1jB 点击链接直接预览课件 1 程序是怎么跑起来的&#xff1f;…

得到的旋转向量和平移向量转换成旋转矩阵 (SE(3))

理论过程 头文件说明 1.使用罗德里格斯公式需要包含头文件为#include<opencv2/calib3d.hpp> 2.使用函数cv2eigen需要包含头文件<opencv2/core/eigen.hpp>&#xff0c;但是在则之前要包含一个对eigen定义的头文件&#xff0c;否则会报eigen.hpp文件的错&#xff0c;…

[译稿]同步复制提议 2010-09

2019独角兽企业重金招聘Python工程师标准>>> 同步复制9/2010议案 目录 [隐藏] 1 PAGE状态 2 有何不同之处这个补丁&#xff1f; 3 同步复制概述 4 用户视角 4.1 管理员视角 5 实现 5.1 STANDBY 5.2 MASTER 6 CODE 7 性能分析 8 尚未实现 9 &#xff0c;其他问题 PAG…

STL vector

1、vector是表示可变大小数组的序列容器。 2、就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大小会…

JavaScript 复习之数据类型

一、简介 JavaScript 的数据类型有 7 种&#xff1a; 数值&#xff08;number&#xff09;字符串&#xff08;string&#xff09;布尔值&#xff08;boolean&#xff09;undefinednull对象&#xff08;object&#xff09;Symbol&#xff08;ES6 中新增的类型&#xff0c;表示独…

Nginx反代配置

一、ngx_http_proxy_module模块ngx_http_proxy_module模块可根据用户请求的uri传递至后端服务器&#xff0c;实现反向代理命令&#xff1a;1.proxy_pass设置一个代理服务器的地址&#xff0c;协议&#xff0c;和一个可选的URI的位置应该映射。作为一个协议&#xff0c;“HTTP”…

STL queue priority_queue

queue 队列 queue 队列 就像排队一样&#xff0c;后来的排在后面&#xff0c;先来的先出队。所以只能对队首和队尾的元素进行操作 back()返回最后一个元素empty()如果队列空则返回真front()返回第一个元素pop()删除第一个元素push()在末尾加入一个元素size()返回队列中元素的…

镜头评价指标及测试方法(二)—畸变与分辨率

一、畸变 畸变&#xff08;distortion&#xff09;也称为失真&#xff0c;是由于光阑球差的影响&#xff0c;不同视场的主光线通过光学系统后与高斯像面的交点高度不等于理想像高&#xff0c;两者之差就是畸变。因此畸变只改变轴外物点在理想面上的成像位置&#xff0c;使像的形…

优秀Java程序员应该知道的20个实用开源库

一个优秀且经验丰富的Java开发人员的特点之一是对API的广泛了解&#xff0c;包括JDK和第三方库。我花了很多时间学习API&#xff0c;特别是在阅读Effective Java 3rd Edition之后&#xff0c;Joshua Bloch建议如何使用现有的API进行开发&#xff0c;而不是为常用的东西写新的代…

sersync 同步

Sersync数据同步rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync&#xff0c;远程同步支持本地复制&#xff0c;或者与其他SSH、rsync主机同步。它的特性如下&#xff1a;v 可以镜像保存整个目录树和文件系统。v 可以很容易做到保持原…

python-opencv 形态学

五、形态学运算 检测边和 角点 形态学算子检测图像中的边缘和拐角&#xff08;实际用&#xff1a;Canny或Harris等算法&#xff09; 5.1 检测边缘 形态学检测边缘的原理&#xff1a;在膨胀时&#xff0c;图像中的物体会想周围“扩张”&#xff1b;腐蚀时&#xff0c;图像中的物…

【 HihoCoder】1082 The Marshtomp has seen it all before (暴力 或 脑力)

https://vjudge.net/problem/HihoCoder-1082 暴力 #include <iostream> #include <cstring>using namespace std;char s[205];int main() {int i;while(gets(s)){i 0;int len strlen(s);while(i<len){if((s[i]m||s[i]M)&&(s[i1]a||s[i1]A)&&am…

java 多维数组转化为字符串

int[][] a {{1,2,3},{4,5,7}};System.out.println(Arrays.deepToString(a)); Arrays.deepToString()此方法是为了将多维数组转换为字符串而设计的。 三维二维都可以解决;转载于:https://www.cnblogs.com/lishuaiqi/p/10428612.html

python-opencv 轮廓检测

轮廓检测 图像处理中经常用到轮廓检测,OpenCV-python接口中使用cv2.findContours()函数来查找检测物体的轮廓。 import cv2img cv2.imread(D:\\test\\contour.jpg) gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret, binary cv2.threshold(gray,127,255,cv2.THRESH_BINARY)…

JavaDate类

在JDK1.0中&#xff0c;Date类是唯一的一个代表时间的类&#xff0c;但是由于Date类不便于实现国际化&#xff0c;所以从JDK1.1版本开始&#xff0c;推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。1、使用Date类代表当前系统时间Date d new Date();Sy…

Jupyter Notebook使用教程

1、启动 在终端中输入以下命令&#xff1a; jupyter notebook --allow-root执行命令之后&#xff0c;在终端中将会显示一系列notebook的服务器信息&#xff0c;同时浏览器将会自动启动Jupyter Notebook。 启动过程中终端显示内容如下&#xff1a; $ jupyter notebook [I 08…

一次性理清JavaScript变量等高难度面试问题

主要是解决JavaScript中比较难懂的部分&#xff0c;当然了&#xff0c;这部分经常在面试题中露面&#xff0c;这篇文章主要是讲解解题思路&#xff0c;对新手会有很大帮助&#xff08;如果你仔细看的话&#xff09;。书籍方面&#xff0c;我看的是《你不知道的javascript》,精髓…

yolov3(一:模型训练)

第一部分&#xff1a;训练已有的voc datasets 搞清楚该算法的模型训练流程 Darknet是Joseph维护的开源的神经网络框架&#xff0c;使用C语言编写&#xff1a;https://pjreddie.com/darknet/yolo/ Darknet快速&#xff0c;易于安装&#xff0c;同时支持CPU和GPU计算&#xff1…

Ios生产证书申请(含推送证书)

一、Mac机上生成请求文件。 Mac机上点击证书助手 > 从证书颁发机构请求证书 > 得到CertificateSigningRequest.certSigningRequest请求文件&#xff08;此请求证书建议一直保存&#xff0c;因为根证书的生成需要使用此请求文件&#xff0c;根证书多个app可以使用一个&…

【Python】SyntaxError: unexpected EOF while parsing

找到错误的地方是 少打了半个括号 emmm 1、可能是语法问题&#xff0c;需要自己检查代码 2、可能是用python2.7来运行python3.0的代码不兼容

华为云家庭视频监控帮你一起守护家

设想一下&#xff1f;离开家了突然想起家里空调没关怎么办&#xff1f;家里没人有陌生人入侵了怎么办&#xff1f;不在家家里老人出事了怎么办&#xff1f; 不用愁&#xff0c;总有办法解决的&#xff0c;这些日常生活中极容易遇到的事情&#xff0c;没有分身术的时候&#xff…

SLAM之特征匹配(三)————RANSAC------LO-RANSAC Algorithm

matlab 编译loransac&#xff0c;lapack mex ranH.c时一直链接错误。 原来mex在编译多个文件时要把所有的C文件都列出来。命令如下&#xff1a; mex loransacH.mex.c ranH.c utools.c Htools.c lapwrap.c matutl.c rtools.c -ID:\lapack\headers\lapack -LD:\lapack - lcbia.l…

【Codeforces】1136C Nastya Is Transposing Matrices (矩阵转置)

http://codeforces.com/contest/1136/problem/C 第一个矩阵可否通过转置&#xff0c;变换成第二个矩阵&#xff0c;可以的话输出“YES”&#xff0c;不可以的话&#xff0c;输出“NO” 转置之后&#xff0c;对角线元素是不变的 用map&#xff0c;或者vector 都可以 #includ…

linux基础篇-02,linux时间管理date hwclock cal 简述

################################################时间管理1&#xff0c;date:系统时钟查看当前系统时间[rootJameszhan etc]# date2016年 11月 14日 星期一 20:16:37 CST################################################设定系统时间 2016年 07月 20日 星期三 10:30:00 CST…