Python环境

若无特殊说明,默认指Linux环境下,默认指redhat/centos

macOS下Python环境

系统自带

系统自带的python27:/System/Library/Frameworks/Python.framework/Versions/Current/bin/python

macOS 12.3版本,已经把自带的Python 2给删了!

系统自带的python37:/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions

建议:不要直接用系统自带的python。

因为系统本身会用到这些自带的Python,如果自己的修改出了问题,可能引起系统崩溃!

推荐方式是,使用macOS平台的第三方工具homebrew,去下载管理新版本的Python。

hombrew 安装Python3

可以安装多版本的Python3。

如下查看可以安装的版本:

~ ❯ brew search python
==> Formulae
app-engine-python         micropython               python-lsp-server         python-tk@3.9             python@3.7                pythran
boost-python3             ptpython                  python-markdown           python-typing-extensions  python@3.8                jython
bpython                   python-build              python-tabulate           python-yq                 python@3.9                cython
gst-python                python-gdbm@3.11          python-tk@3.10            python@3.10               reorder-python-imports
ipython                   python-launcher           python-tk@3.11            python@3.11 ✔             wxpython

我这里直接安装最新版本:

~ ❯ brew install python@3.11
...

接下来做额外的操作,为的是:

  • 输入pythonpython3 都直接指向新安装的python3.11,避免调用系统默认的python3。
  • 简化输入。

pip工具同理。

设置过程如下:

~ ❯ ln -s /usr/local/bin/python3.11 /usr/local/bin/python3
~ ❯ ln -s /usr/local/bin/python3 /usr/local/bin/python
~ ❯ ln -s /usr/local/bin/pip3.11 /usr/local/bin/pip3
~ ❯ ln -s /usr/local/bin/pip3 /usr/local/bin/pip

为了让自己安装的命令优先于系统自带版本的命令/usr/bin/,需要调整「环境变量$PATH」的搜索路径顺序!

~ ❯ sudo vim /etc/paths

/usr/local/bin 放到第一行!保存退出,重启终端即可生效。

配置完成后进入的就是新安装的Python3.11了。

~ ❯ python -V 
Python 3.11.0

~ ❯ python3 -V
Python 3.11.0

~ ❯ python3.11 -V
Python 3.11.0

~ ❯ pip -V
pip 22.3.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)

~ ❯ pip3 -V   
pip 22.3.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)

~ ❯ pip3.11 -V
pip 22.3.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)

pip管理的包放在/usr/local/lib/pythonX.X/site-packages下。

如果用which以及ll命令查看,就会发现这些都是软连接,真正指向的是homebrew安装在Cellar/python@3.11目录下的可执行程序。

hombrew 安装Python2

Python2.x,官方不再继续维护,所以homebrew团队也不支持直接安装了!

但是参与一些老旧项目的维护时,可能还是需要搭建Python2的环境来调试,因此还是有必要了解下安装方案。

参考问答:macos - How to reinstall python@2 from Homebrew? - Stack Overflow

建议用pyenv来装python2版本。

下面使用wget下载ruby源码fomula文件再brew安装python@2.rb的方法已经失效了,会踩很多坑。

pip镜像源

临时使用(比如这里的清华镜像源):

$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple XXX

可能碰到问题:

Could not fetch URL https://pypi.tuna.tsinghua.edu.cn/simple/requests/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.tuna.tsinghua.edu.cn', port=443): Max retries exceeded with url: /simple/requests/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

解决方法是,加--trusted-host参数获取ssl证书,比如:

$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.douban.com XXX  

默认生效新的镜像源:

创建~/.pip/pip.conf,内容如下。

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

或者,执行脚本创建,sh脚本内容为。

mkdir ~/.pip/
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = http://pypi.douban.com/simple/ 
[install]
pypi.douban.com
EOF

Python虚拟环境方案

个人推荐的方式:以下2种方案配合使用。

  • venv :内置方便,和项目本身关联强。

  • virtualenv + virtualenvwrapper :第三方,可以统一管理虚拟环境,方便创建和切换;可以指定虚拟环境所使用的Python版本(先安装过对应版本的Python)

virtualenv + virtualenvwrapper 安装和使用

使用pip安装virtualenv + virtualenvwrapper

~ ❯ pip3.11 install virtualenv
...
Successfully installed distlib-0.3.6 filelock-3.8.2 platformdirs-2.6.0 virtualenv-20.17.1

~ ❯ pip3.11 install virtualenvwrapper
...
Successfully installed pbr-5.11.0 stevedore-4.1.1 virtualenv-clone-0.5.7 virtualenvwrapper-4.8.4

再配置virtualenvwrapper,添加如下。macOS下使用 zsh 终端,所以应该是.zshrc 文件,而不是.bash_profile

# python3 虚拟环境 virtualenv + virtualenvwrapper
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python  # 一般用软连接指向了指定的版本
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export WORKON_HOME='~/.virtualenvs'
source /usr/local/bin/virtualenvwrapper.sh

/usr/local/bin/virtualenv可执行程序在安装完virtualenv 就有了;virtualenvwrapper.sh脚本是在安装virtualenvwrapper 创建的。

执行source ~/.zshrc,就能看到创建了~/.virtualenvs目录以及一系列文件。

~ ❯ source ~/.zshrc
...
~ ❯ ls ~/.virtualenvs/
get_env_details  postdeactivate   postmkvirtualenv preactivate      premkproject     prermvirtualenv
initialize       postactivate     postmkproject    postrmvirtualenv predeactivate    premkvirtualenv

并且workon 等命令可用了。

~ ❯ mkvirtualenv lab_venv --python==python3.11
...

  lab_venv ~ ❯ deactivate

~ ❯

~ ❯ workon
lab_venv

~ ❯ workon lab_venv

  lab_venv ~ ❯

mkvirtualenv命令的参数--python就可以用来指定虚拟环境所使用的本机环境已安装的Python版本。

这样公共的Python3.11环境就不要再去安装各种库里,保持干净。不同项目根据需要创建虚拟环境和安装相关库即可。

Linux下2、3版本共存时的虚拟环境设置

参与一些老项目和系统维护时,总会碰到python2的默认环境。此时又可能用到了python3,那么共存时,虚拟环境的配置需要注意个问题:

yum命令,可能依赖的是Python2版本,如果改动默认的python指向python3,会导致yum使用异常!

  • 方案一:由Python2安装virtualenv + virtualenvwrapper

  • 方案二:Python3安装virtualenv + virtualenvwrapper。但是需要修改virtualenvwrapper.sh脚本,不去使用默认的python,避免调用python2,导致报错。替换如下:

# VIRTUALENVWRAPPER_PYTHON="$(command \which python)"
VIRTUALENVWRAPPER_PYTHON="$(command \which python3)"
  • 方案三:使用venv为python3项目单独创建虚拟环境。python2则安装virtualenv + virtualenvwrapper进行使用。

个人认为方案三可能比较合适。避免不必要的改动,减少对系统影响。

当然,Linux下一般都是公共环境了,不太会出现个人需要统一管理虚拟环境的情况。所以venv使用的场景更多。

Python的MySQL操作库

安装MySQL操作库之前,注意安装依赖:

$ yum -y install mysql-devel gcc gcc-devel python-devel

否则会碰到如下问题:

  • python依赖问题_mysql.c:37:20: fatal error: Python.h: No such file or directory
    • 解决:执行yum install -y python3-devel 安装依赖
  • gcc缺失unable to execute 'gcc': No such file or directory
    • 解决:执行yum install -y gcc 安装依赖
  • mysql_config缺失
File "setup_posix.py", line 25, in mysql_config
    raise EnvironmentError("%s not found" % (mysql_config.path,))`

EnvironmentError: mysql_config not found

# 或者

    File "/tmp/pip-install-dmuvzmv3/mysqlclient/setup_posix.py", line 31, in mysql_config
     raise OSError("{} not found".format(_mysql_config_path))
  OSError: mysql_config not found
    • 解决:执行yum install -y mysql-devel安装依赖

「推荐」mysqlclient

  • MySQL-python的Fork版本,完全兼容!
  • 使用也是:import MySQLdb
  • 支持 Python3.x!
  • Django ORM的依赖该工具
  • 支持使用原生 SQL 来操作数据库

推荐使用该库!

pip安装:

$ pip install mysqlclient

可能出现问题:ModuleNotFoundError: No module named '_ctypes',换如下的源码setup安装方式。

源码安装:

$ tar xvf mysqlclient-1.3.14.tar.gz
$ cd mysqlclient-1.3.14
$ python setup.py install

「推荐」pymysql

若不追求速度,可以用这个库

  • 安装方便
  • 调用方式不同:import pymysql
  • 纯 Python 实现,速度上比不上mysqlclient
  • 也兼容 MySQL-python, 需要执行pymysql.install_as_MySQLdb()

安装:

$ pip install pymysql

ORM方式

  • SQLAlchemy 既支持原生 SQL,也支持 ORM 的工具。它并不提供底层的数据库操作,而是要借助于MySQLdbPyMySQL等第三方库来完成。
  • Django's ORM

「建议不用」MySQL-python

  • 别名:MySQLdbPython-MySQL
  • 使用:import MySQLdb
  • 基于C开发,仅支持 Python2.x!
  • 安装非常不友好,已停止维护。

不推荐!已经有很多衍生版本更易用。

pip安装:

$ pip install MySQLdb
# 或者
$ pip install mysql-python

yum方式:

$ yum install -y MySQL-python

安装到了系统默认python的site-packages目录下。一般用于 puppet 管理机器时,执行该库的统一安装。

安装这个库会出现非常多问题,容易踩坑。

Linux下的Python环境

Python3 源码编译方式安装

需要root身份安装。

安装依赖如下:

$ yum -y install gcc
$ yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

源码编译安装python,需要有gcc,务必确认gcc版本正确,否则安装完的python可能会在安装第三方库时出现奇怪的问题。

可能你还见过用这个方式安装相关依赖:

$ yum -y groupinstall "Development tools"

这包括上面的大部分依赖,但会有缺漏,故执行上一条命令更稳妥。

  • yum -y install libffi-devel 3.7版本需要这个依赖。

安装:

$ wget https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tgz
# 解压,切换root,进入该安装包解压后的源码目录

$ ./configure  --prefix=/usr/local/python3.7
$ make && make install

安装完成,创建软连接,便于调用:

$ ln -s /usr/local/python3.7/bin/python3.7  /usr/bin/python3
$ ln -s /usr/local/python3.7/bin/pip3.7  /usr/bin/pip3

注意python3.7替换为真正安装的Python版本即可。3版本,一般带有pip工具了。

一些可能的报错,以及解决方法:

  • zipimport.ZipImportError: can’t decompress data
    • 因为缺少zlib 的相关工具包导致,安装zlibzlib-devel依赖即可
  • 执行pip时,显示找不到ssl模块
    • 重新安装需要依赖,即可正常使用pip:
$ yum install -y openssl
# 进入python3源码安装包
$ make clean
$ make && make install

Python2 源码编译安装

过程基本同3,以下只做简单记录。

需要root身份安装。

依赖:

$ yum install -y gcc
$ yum install -y zlib zlib-devel bzip2-devel openssl  openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel  readline-devel sqlite-devel bzip2-devel.i686 openssl-devel.i686 gdbm-devel.i686 libdbi-devel.i686 ncurses-libs,zlib-devel.i686
$ yum install -y python-devel.x86_64  # 安装uwsgi时可能出现的报错,需要该依赖

安装:

$ wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
$ tar -zxf Python-2.7.18.tgz
# 切换root,进入安装包源码目录
$ ./configure --prefix=/usr/local/python2.7.18
$ make && make install
# 安装完成,创建软连接,便于调用
$ ln -s /usr/local/python2.7.18/bin/python2 /usr/bin/python2
$ ln -s /usr/local/python2.7.18/bin/python2.7  /usr/bin/python2.7
# 确认安装成功
$ python2 -V

可能的报错和解决:

  • 使用yum报错:No module named yum

    • 修改/usr/bin/yum 第一行指定为旧版本的python路径即可。
  • centos 7以上,如上修改后在pip安装包时可能还有报错:

      Traceback (most recent call last):
      File "/usr/libexec/urlgrabber-ext-down", line 22, in 
          from urlgrabber.grabber import \
      ImportError: No module named urlgrabber.grabber
    
    • 需要同样修改 /usr/libexec/urlgrabber-ext-down

第三方库的安装

pip安装 「目前最常用」

源码方式手动安装。

基本步骤如下:

  1. wget 源码包
  2. tar 解压,换root,cd 进入源码目录
  3. python setup.py install

easy_install

这是Python setuptools系列工具中的一个,可以用来自动查找、下载、安装、升级依赖包。

需要先安装过setuptool