您的当前位置:首页Python环境Memo

Python环境Memo

2024-12-14 来源:哗拓教育

最近同时看两本书,都是关于如何利用python做数据分析的。
两本书对应两种业务场景,因此分别对应着两个不同的开发环境(其实是对应不同的发行版本)。这就很麻烦了:

  1. 不同环境下冲突起来没完没了,一个不小心,就要重装系统了。Mac OS 怎么重装都是个问题。
  2. 日常的中文语境里,没有“环境”这个概念,理解起来很恶心。
  3. Google里,对环境的定义也不够清晰。
    简单写一下这两天Google来理解,也没辜负这些tabs :)


    解决一个问题前不关闭tab的习惯

什么是发行版本?

环境

一般而言,一个“环境”就是相互依赖的不同版本的不同库之间的“捆版”。同一个库只有一个版本。

版本环境

虚拟环境

虚拟环境意味着和系统(默认)环境分离的独立环境。通过与系统环境以及其他Python环境隔离, 避免干扰。

显然,版本环境是虚拟环境的一种。

OS X寻找环境的方式

OS X通过directory找到目标版本的安装地址,不同版本的directory是在系统环境变量($PATH)里声明的。当$PATH中有多个版本信息时,查询的逻辑类似“栈”,最近写入的最先调用。
PS:不同编译程序都需要到$PATH查找自身对应的环境变量,如ruby,perl,java等。

<$PATH>** -->** <python_version>

一个常见的环境冲突例子

默认的python是canopy,因为其他需求,需要安装anaconda。安装后,bash优先调用anaconda,因为python的升级很多时候是不考虑前向兼容的,容易莫名其妙出现一些之前从未出现的报错或警告。

pyenv管理版本环境

PYENV_VERSION-->.python-version--><$PATH>-->.pyenv/shims--><python_version>

pyenv-virtualenv插件管理虚拟环境

pyenv环境管理工具好处:

  1. 隔离项目之间的第三方包依赖
  2. 在没有权限的情况下安装新的Python软件包
  3. 部署应用时,把开发环境的虚拟环境打包到生产环境

其他

常用命令

pyenv命令

pyenv versions

当前使用的版本

pyenv version

我们可以查看一下可安装的python版本

pyenv install -l

选好要安装的版本后,运行下面这条命令安装(.pyenv/cache用于缓存公用的package)

pyenv install <python_version>

安装完成之后需要对数据库进行更新:

pyenv rehash

我们可以用pyenv versions查看已安装的版本,要切换python版本,可以用

pyenv global/local <python_version>

运行global命令会切换全局(系统默认)的python版本;而local命令则会在当前目录下创建.python_version,管理当前目录及其子目录(子目录有.python_version的情况下)的python版本。(需要cd到目标文件夹)

设置本次shell中临时执行的python版本

pyenv shell <python_version>

卸载(删除)已安装的python版本

pyenv uninstall <python_version>

pyenv-virtuallenv命令

创建一个 Python 版本为<python_version>的环境, 环境叫做<envname>。

pyenv virtualenv <python_version> <envname>

激活虚拟环境:

pyenv activate <envname>

启用虚拟环境之后,命令行提示符将以虚拟环境名为前缀,显示:

<envname> <basic_info> $

提示符前面的<envname>就是该环境已被激活的标志。这样你就可以在这个虚拟环境下进行工作了。也可以通过python打印出os.sys.path进行验证,同时,执行 pip help,你可以看到 pip freeze是输出当前 Python 环境下已经安装的所有第三方库。

Python 3.5.1 |Continuum Analytics, Inc.| (default, Dec 7 2015, 11:24:55)
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>>** print(os.sys.path)**
['', '/Users/NoraChan/.pyenv/versions/test/lib/python35.zip', '/Users/NoraChan/.pyenv/versions/test/lib/python3.5', '/Users/NoraChan/.pyenv/versions/test/lib/python3.5/plat-darwin', '/Users/NoraChan/.pyenv/versions/test/lib/python3.5/lib-dynload', '/Users/NoraChan/.pyenv/versions/test/lib/python3.5/site-packages', '/Users/NoraChan/.pyenv/versions/test/lib/python3.5/site-packages/setuptools-23.0.0-py3.5.egg']

离开已经激活的环境:

pyenv deactivate

我们再回头看下 <envname>目录的结构,其下面的bin目录中有 python.exe pip.exe这些程序,在虚拟环境已激活的情况下,你调用 python或者 pip都是调用的此目录中的程序。此时系统中的 python.exe 被 virtualenv 通过设置环境变量隐藏了起来。而 Lib目录下就是存放各种新安装的库。其中Lib/<python_version>/site-packages包含了<python_version>下面的库。默认情况下,虚拟环境会依赖系统环境中的site packages,就是说系统中已经安装好的第三方package也会安装在虚拟环境中,如果不想依赖这些package,那么可以加上参数 --no-site-packages建立虚拟环境。

--distribute参数将会自动在虚拟环境中安装pip,免去了手动安装的麻烦。
--no-site-packages参数是在创建此虚拟环境中不从系统 Python 中把已经安装了的库也安装到这里来,所以这里是一个干净的新 Python 环境。你可以在这里调用 pip或者 easy_install来安装各种你需要的库到这个环境中来,而不会影响到你系统中 Python 的情况,所以说它是一个虚拟的Python 环境。

从os.sys.path中可以看出,这个环境下执行python相关的操作都是限定在虚拟环境中。

# Showing only files/directories relevant to the discussion at hand
.
|-- bin
| |-- activate # <-- Activates this virtualenv
| |-- pip # <-- pip specific to this virtualenv
| `-- python # <-- A copy of python interpreter
`-- lib
`-- python3.5 # <-- This is where all new packages will go

conda命令

conda create -n py3 python=3.4 anaconda
source activate py3

对于python2.7版本:

conda create -n py2 python=2.7 anaconda
source activate py2

这样就会在Anaconda安装目录下的envs目录下创建py2这个目录。
向其中安装扩展可以直接用conda install并用-n指明安装到的环境,这里自然就是py2。像virtualenv那样,先activate,然后在虚拟环境中安装。

管理package####

conda update <package-name>
condo install <package-name>=x.x #安装包,指定包的版本

conda和pip关联的很好。使用pip安装的东西可以使用conda来管理

针对特定环境安装特定版本的库

可以测试多个python版本的环境

Homebrew安装pyenv

安装pyenv有多种方式,Homebrew是其中一种。这种方式是不修改系统环境变量的。因此Homebrew不会破坏OS X 原生的环境。同时它安装的所有文件都是在用户独立空间内的,这让你安装的所有软件对于该用户来说都是可以访问的,不需要使用sudo命令。

Homebrew安装pyenv的警告:
1.使用Homebrew的目录:

==> Caveats
To use Homebrew's directories rather than ~/.pyenv add to your profile:
export PYENV_ROOT=/usr/local/var/pyenv

这里的意思在profile里执行,用于bash里初始化环境变量:

echo 'PYENV_ROOT=/usr/local/var/pyenv' >>~/.bash_profile

目前建议不要这样子做,用Homebrew的目录并没有好处,而且容易产生问题。

2.激活shims:

==> Caveats
To enable shims and autocompletion add to your profile:
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

不加这一行的情况下,当我们使用pyenv global 3.5.1后现在指向了3.5.1,但是当运行python version却还显示的是2.7.2

echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >>~/.bash_profile

pyenv Environment variables

You can affect how pyenv operates with the following settings:

name default description
PYENV_VERSION Specifies the Python version to be used.Also see
PYENV_ROOT ~/.pyenv Defines the directory under which Python versions and shims reside.Also see pyenv root
PYENV_DEBUG Outputs debug information.Also as: pyenv --debug <subcommand>
PYENV_HOOK_PATH Colon-separated list of paths searched for pyenv hooks.
PYENV_DIR $PWD Directory to start searching for .python-version files.

pyenv-virtualenvwrapper

利用非bin/python执行.py

一些bash的脚本,需在开头一行指定脚本的解释程序,如:#!/usr/bin/env python但有时候也用 #!/usr/bin/python,区别如下:
#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器; #!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。 #!/usr/bin/python相当于写死了python路径; #!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法。

使用了pyenv之后会, pyenv的python在/usr/bin/python前面了。

PATH=/Users/rcf/.pyenv/shims:/Users/rcf/Soft/maven/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

所以以后再用#!/usr/bin/python就会出现版本不匹配了。建议使用
#!/usr/bin/env python

或者

shell mv /usr/bin/python /usr/bin/python2.7.10 ln -s /usr/bin/python /Users/rcf/.pyenv/shims/python

类似工具:

版本管理工具 语言
rvm ruby
nvm node
pyenv python

其他命令

bash命令
which python
在系统环境变量中定位python的directory
pyenv which python
在shims中定位python的directory

Reference

显示全文