Python环境出坑记

祸兮福所倚,福兮祸所伏

理想很美好,现实很骨干…..

坑坑坑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Goal : Office PC -> Install Vmware & CentOS -> Pythoner
But : Settings -> how to root -> how to install git -> how to talk to unblock openssh
-> how to use zsh -> how to use oh-my-zsh
-> how to use atom -> libsecret error -> still in keng
-> how to install pyenv -> how to make it work
-> how to make shell work for me -> how to config -> where is shortcut?
-> how to blog -> how to use Chinese input
-> how to know linux very well -> linux books & shell programming learning
Crazy But: -> pyenv install do not work here -> pool internet -> need another way -> mirror
-> pip install do not work here too -> pool internet -> need another way -> mirror again
On My MAC -> why there are so many pythons? -> what is anaconda python -> which python am i using
-> how to clean them all -> how to make them all works for me as I want?
Jupyter Notebook -> want to use an package -> pyenv installed
-> conda doesn't -> cannot use

上面每一个箭头都是一段入坑出坑,也许还有没出来的坑。踩坑多了,也就不觉得自己在坑里。今天梳理一下Python 环境相关的问题和坑,作一个经验总结。

前情提要

你有一台MAC 或者Linux 系统,已经安装了zsh 和 Oh-my-zsh ,下一步准备和python 一起愉快的玩耍。你肉身在墙内,由于种种网络环境的限制还不一定能够完全自由的站在墙外。使用的环境主要以python3 为主,但是语言这件事情,总是越自由一些越好不是么?也就是说最好可以对python 的环境进行有效的管理。
在你还对python 懵懵懂懂的时候,有人推荐你安装了anaconda,据说这个神器可以一劳永逸的解决环境问题,让你专注在编程本身。你装了Anaconda,但依然没有摆脱折腾环境的命运,后来还折腾过Anaconda3 ,因为原来装的那个python 自带的是2。
又过了一段时间,不断的听说pyenv 、pyenv virtualenv 惊闻anaconda 也是一个大大大坑,自己还浑然不知。随着学习的深入,真是举步维艰,每一次都倒在折腾环境上

系统里既有python2 又有python3,不知道如何切换,在pip 安装包时经常混淆。打开jupyter notebook 也是很容易就报错,一查发现还是环境的问题,还不容易搞明白了,安装一个包,结果发现总是连不上pypi,有一种想砸电脑的冲动……
pyenv virtualenv -> pyenv -> anaconda python -> zsh/bsh/csh -> internet

忍无可忍,无需再忍,把这个事情搞清楚吧~

基本知识

一个系统里可以安装N个python

在一台Linux中可以安装多个版本的Python,但是系统默认的一般都只有一个,所以你需要一个可以管理多个版本python的软件来总体管理。如果你对Windows系统比较熟悉,可以类比一台Win下安装了一个虚拟机,在这个虚拟机里,你想怎么搞都行。这个python环境管理的工具就叫:pyenv。

Linux 如何执行命令

我们在终端输入的任何一条命令,Shell 都会去到几个和“环境变量”($PATH)相关的文件中寻找对应的路径下是否有可以执行的文件。这些可执行的文件里放着的是我们输入的命令和如何执行这些命令的代码说明。只有找到了这个文件,Shell才知道如何执行命令。这个过程可以简化的理解为:
输入命令 -> shell 读入命令 -> 查找文件 -> 定位文件中的环境变量 -> 浏览环境变量对应的路径下的文件 -> 在文件里寻找命令和执行方法 -> 找到了,按照要求执行 -> 找不到,输出找不到

如何执行python 的命令

有了上面的知识,理解起来就很简单了,python 输入终端后,系统首先会去找到解释这个python 命令的文件,然后执行。由于系统里有多个python,那么调用哪一个python,其实就是看环境变量中哪一个python 环境对应的目录靠前,问题迎刃而解。

什么是Shell

我们要和Linux 交流,要说Linux 能听懂的语言,并且要通过一个方式传递给Linux 系统。这个语言就是Shell 脚本语言,而这个工具,我们看到的是终端,其实终端里用于交互的也可以先成为Shell,可以理解为和Linux 交互的一种工具。Shell 把命令也就是Shell脚本传递给Linux,Linux知道我们的意图后执行返回输出,大概可以这么理解。

多个不同的Shell 和环境变量

除了python的哪些坑,其实shell本身也有一些坑,shell有很多种,Bash,Z-bash等等。我习惯用的是Z-bash,也就是zsh。在启用了zsh之后,原来的一些环境变量需要进行调整,因为最终zshrc会调用一部分其他环境变量,还有一些是在zshrc自己做的配置。环境变量的相关文件语法是shell脚本语言的语法。建议有时间精力可以了及相关知识,会少入很多坑。

代码实践

理论知识再多,不如来看看代码。

shell常用的和环境变量相关的命令

  • $ env$ printenv用于展示环境变量配置文件的内容。
  • $ set展示所有的变量
  • $ export将变量导出到接下来的程序环境中
  • $ echo输出,如果跟着变量名,会把变量的值输出

相关的环境变量配置文件

涉及到的文件

1
2
3
/etc/profile
/etc/bashrc
/etc/zshrc

如果是/etc/目录下则是所有用户共享的配置文件

1
2
3
4
~/.profile
~/.bash_profile
~/.bashrc
~/.zshrc

在自己的目录下则是仅有你这一个用户可用。

环境变量示例

  • export PATH="/home/leon/.pyenv/bin:/usr/local/bin"
    export表示将变量导出到接下来的程序环境中。冒号是连接符号,这里程序会顺序的逐个去找对应的执行文件。bin文件夹下一般存放的是可执行的二进制文件,当我们输入命令的时候,程序就会逐个文件去找,如果找到了就会执行,找不到,会反馈找不到
  • eval "$(pyenv init -)"这句命令稍微复杂,是理解pyenv和环境变量关系的关键,分为两部分,一部分是shell的命令,一部分是理解pyenv init命令。

    • eval:脚本语言中表示将后面的内容按照命令的方式直接执行
    • $()的语法表示将命令执行的结果输出后再执行外面的命令,也就是说这一行会先执行 pyenv init - 之后,eval再执行 pyenv init - 的结果。
    • 关于pyenv init的命令,参考这两个文件,说的非常清楚:
    • Command Reference
    • Simple Python Version Management: pyenv
    • 整体解释:首先执行pyenv init -的命令后的输出替换双引号中的内容,然后将双引号中给定的文本作为shell 命令执行。命令说明可以参考eval usage explan
  • 常用变量:$HOME$PATH

最佳实践

  • 在自己的程序里跑:which python会发现调用的目录后,再执行 echo $PATH ,可以应证前面的目录或者其父目录一定在$PATH中。
  • 查看自己的~/.zshrc 文件
  • 了解anaconda python的路径,争取彻底处理,或者不会对自己现在的环境配置产生不良影响。

解决办法

回到最初的问题,如何处理环境问题呢,整体思路是:如果你不了解如何采用命令行进行 anconda 或者conda 的配置方法时,建议全面放弃该整体环境。通过设置pyenv 插件的方式获得一个自己可控的多python 环境。这整个过程里都会涉及到对环境变量文件的修改,建议真正理解前面的知识点后再执行相关的操作。

Bye Anaconda

配置需要的环境

  • pyenv:参考官方文档pyenv,注意环境变量的配置和启动后的环境检查。
  • ipython 安装:按照官方文档安装,令人发指的简单。
  • jupyter notebook 安装:按照官方文档的介绍,同样是令人发指的简单。

注意,以上环境安装之前,先确认处于的python 环境是你需要的python 环境。

回到Anaconda

之前我也推荐给小伙伴安装anaconda套件,这样就可以不管各种环境问题了,这是一个初级的处理方案,当你开始对python 有更多了解有更多定制话的需求之后,当初盲目安装的anaconda反而成了“不可承受之重”,因为自己压根不知到anaconda默默的做了哪些系统配置的改动。
其实错并不在anaconda 本身,如果你是数据科学工作者,并不希望被环境折腾,利用这样的套件是避免底层环境配置的好办法。但是对于python 的开发者来说,了解python 的生态系统,能够自己动手配置适合自己开发的环境还是很有必要的。更了解底层的机制有利于我们更好的了解计算机本身。这时候的ipython 和jupyter 也更容易被我们所用。

未解之谜

最后其实留了一个小问题:pip 的安装。一个很坑的事情是python的很多一手资源获取的速度非常非常的慢。解决办法有两个,翻出去,或者找一个国内的镜像。
动手试试看吧~如果有必要,以后再来增补这一部分的内容。

私货

优先和程序沟通,出了啥问题都先找谷哥是新手的第一阶段,其实程序一般都会提供足够的信息,当自己知道的不够多的时候再找谷哥。怎么和程序沟通,自然是找帮助文档,怎么找帮助文档,shell中主要有两个命令可以参考:
XXX -h
man XXX
一般来说都会有自己想要的答案。

其他的命令或者编程中需要查看的,自己应该优先探索,了解清楚一个如何方便调取这些内容的方法和体系,事半功倍。

Reference

ChangeLog

170827 新建