第2章 Python生态工具
2.1 python内置小工具
2.1.1 快速启动一个下载服务器
- python2
python -m SimpleHTTPServer
- python3
python -m http.server
2.1.2 字符串转为json
利用json.tool模块,能够格式化json字符串,如:
echo '{"job": "dev", "name": "pcm", "sex": "male"}' |python -m json.tool
2.1.3 检查第三方库是否正确安装
确认第三方库是否正常安装,不可能每次都进入到python命令行中使用import语句导入观察结果来判断,可以使用下面的方式进行判断:
python -c "import paramiko"
2.2 pip的高级用法
2.2.2 pip常用命令
pip的子命令
子命令 | 解析说明 |
---|---|
install | 安装软件包 |
download | 下载安装包 |
uninstall | 卸载安装包 |
freeze | 按照requirements格式输出安装包,而已到其他服务器上执行pip instal -r requirements.txt直接安装软件 |
list | 列出当前系统中的安装包 |
show | 查看安装包的信息,包括版本、依赖、许可证等 |
check | 检查安装包的依赖是否完整 |
search | 查找安装包 |
wheel | 打包软件到whell格式 |
hash | 计算安装包的hash值 |
completion | 生成命令补全配置 |
help | 帮助信息 |
2.2.3 加速pip安装的技巧
- 使用豆瓣或者阿里云的源加速软件安装
可以直接指定镜像地址
pip install -i https://pypi.douban.com/simple/ flask
也可以把镜像源写入配置文件中,在linux系统中创建 ~/.pip/pip.conf
文件,内容如下(清华源):
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
- 将软件下载到本地部署
下载到本地
pip install --download=`pwd` -r requirements.txt
本地安装
pip install --no-index -f file://`pwd` -r requirements.txt
2.3 Python编辑器
Linux下推荐使用vim编辑器,但是需要做比较多的修改才能方便地用来编写python程序。windows下推荐使用PyCharm编辑器,有语法高亮等高级功能。
2.4 Python编程辅助工具
2.4.1 Python交互式编程
最简单的python的交互式编程的方法就是使用标准的python shell,在命令行中直接输入python即可。
虽然很方便,但是标准的python shell没有语法高亮,不支持tab自动补全,也没有自动缩进的功能。
所以我们更加推荐使用IPython来进行交互式的编程学习,IPython是增强型的Python shell,除了解决上面说的问题外,还可以方便地进行交互式编程和数据分析。
2.4.2 使用IPython交互式编程
Linux下可以使用yum或者apt命令直接安装
yum install ipython
具体使用方法略过,忘记的可以上网查找教程。
2.4.3 jupyter的使用
jupyter就是以前的IPython Notebook,是一种新兴的交互式数据分析与记录工具,它可以通过浏览器访问本地或者远程的IPython进程,并利用浏览器的图形界面,增强IPython的可视化输出。
安装方法如下:
pip install jupyter
启动方法如下:
jupyter notebook --no-browser --ip=0.0.0.0
具体使用方法略过,可以上网找对应的教程。
2.5 Python调试器
在编写较大的程序的时候,调试器的使用是必不可少的。这里我们介绍两种调试器,分别是Python标准库自带的pdb和开源的ipdb。
2.5.1 标准库pdb
pdb的部分调试命令
命令 | 缩写 | 说明 | 命令 | 缩写 | 说明 |
---|---|---|---|---|---|
break | b | 设置断点 | list | I | 根据参数打印源码 |
continue | cont/c | 继续执行至下一个断点 | up | u | 移动到上一层堆栈 |
next | n | 执行下一行,如果下一行是子程序,不会进入子程序 | down | d | 移动到下一层堆栈 |
step | s | 执行下一行,如果下一行是子程序,会进入子程序 | restart | run | 重新开始调试 |
where | bt/w | 打印堆栈轨迹 | args | a | 打印函数参数 |
enable | - | 启用禁用的断点 | clear | cl | 清除所有的断点 |
disable | - | 禁用启用的断点 | return | r | 执行到当前函数结束 |
pp/p | - | 打印变量或表达式 |
有两种方法启动Python调试器,一种是在命令行参数中指定使用,如下所示:
python -m pdb test_db.py
另外一种实在python代码中调试pdb模块的set_strace方法设置一个断点。当程序运行至断点时,将会暂停执行并打开调试器。
#!/usr/bin/python
from __future__ import print_function
import pdb
def sum_nums(n):
s=0
for i in range(n):
pdb.set_trace()
s += i
print(s)
if __name__ == '__main__':
sum_nums(5)
这两种方法没什么本质的区别,通常是较小的程序我们可以直接通过命令行去启动调试,这样从程序的第一行开始进行调试;如果程序较大,我们会在需要调试的地方设置 set_trace 方法设置断点,这样只有在执行到设置断点的地方才开始启动调试器。
2.52 开源的ipdb
ipdb之于pdb,就相当于IPython之于python。虽然实现同样的功能,但是在易用性方面做了很多改进。
由于ipdb是一个第三方库,我们需要先安装才能使用。
pip install ipdb
前面的例子用ipdb进行改造的话,就会变成这样:
#!/usr/bin/python
from __future__ import print_function
import pdb
def sum_nums(n):
s=0
for i in range(n):
ipdb.set_trace()
s += i
print(s)
if __name__ == '__main__':
sum_nums(5)
除了使用pdb和ipdb之外,我们还可以使用PyCharm的图形化界面进行调试。
2.6 Python代码规范检查
2.6.1 PEP8 编码规范介绍
PEP8是事实上的代码风格标准,由于内容比较多就举个简单的例子进行介绍。
在Python中,包的导入在使用import时应该一次只导入一个模块,不同的模块应该独立一行,例如
#正确的示例
import os
import sys
#反面的示例
import os, sys
并且在导入模块的顺序也是有要求的,先是导入标准模块,其次导入第三方模块,最后导入当前应用程序,各个分组之间以空行分割。
import time
import json
import yaml
import psutil
from mango_agent.cation.common import kill_mongod,start_mogo_node
2.6.2 使用pycodestyle检查代码规范
遵循相同标准的代码风格非常重要,为了帮助大家形成统一的代码风格,Python官方提供了同名的命令行工具,该工具能够检查Python代码是否违反PEP8规范,并对违反的位置做出相应的提示.
pip install pep8
为了避免检查工具和代码风格名称一样带来的困惑,这个工具已经重命名为pycodestyle,安装方法同上。
pip install pycodestyle
使用方法
pycodestyle --first test.py
2.6.3 使用autopep8将代码格式化
autopep8是一个开源的命令行工具,它能够将Python代码自动格式化为PEP8风格。autopep8使用pycodestyle工具来决定代码中哪部分需要被格式化。安装和使用非常简单。
#安装
pip install autopep8
#使用--in-place直接修改文件,否则不会修改文件,会把结果输出到命令行
autopep8 --in-place test.py
2.7 Python工作环境管理
因为Python2和Python3之间存在着较大的差异,然后在很多场景下我们都需要同时用到Python2和Python3.所以,对Python的版本进行管理就很有必要了。
在这一节里,我们将会介绍两个工具,即pyenv和virtualenv。前者用于管理不同的Python版本,后者用下管理不同的工作环境。有了这两个工具,Python相关版本问题将不再是问题。
2.7.1 使用pyenv管理不同的Python版本
pyenv是一个python版本管理工具,它能够进行全局的Python版本切换,也可以为单个项目提供对应的Python版本。使用pyenv后,可以在服务器上安装多个不同的Python版本,也可以安装不同的Python实现。不同的Python版本之间的切换也非常简单。
-
pyenv的安装
-
pyenv的使用
我们通过pyenv的instal命令,可以查看pyenv当前支持哪些Python版本,如下:
pyenv install --list
使用pyenv安装不同版本的Python版本:
pyenv install -v 3.6.0
pyenv install -v 2.7.13
查看当前系统中包含的Python版本:
pyenv versions
通过pyenv选择不用版本的Python版本,如下
pyenv global 3.6.0
切换Python版本以后,与版本相关的依赖也会一起切换。因此,我们不用担心不同的版本在系统是否会相互干扰。
如果要删除某个Python版本,使用uninstall命令即可。
pyenv uninstall 2.7.10
2.7.2 使用virtualenv管理不同的项目
virtualenv本身是一个独立的项目,用以隔离不同项目的工作环境。例如,用户pcm希望在项目A中使用flask0.8这个版本,与此同时,又想在项目B中使用Flask0.9这个版本。如果我们全局安装flask,必然无法满足用户的需求。这个使用我们就可以使用virtualenv。
读者需要注意pyenv和virtualenv的区别。pyenv用以管理不同的Python版本,例如,你的系统工作时使用Python2,学习的时候使用Python3.virtualenv用以隔离项目的工作环境,如同上面的举例。我们只要组合pyenv和virtualenv这两个工具,就能够构造Python和第三方库的任意版本组合,拥有很好的灵活性,也避免了项目之间的相互干扰。
virtualenv本身是一个独立的工具,用户 可以不使用pyenv而单独使用virtualenv。但是,如果你使用了pyenv,就需要安装pyenv-virtualenv插件,而不是通过virtualenv软件使用virtualenv的功能。
- pyenv-virtualenv的安装
略过 - pyenv-virtualenv的使用
#创建项目A的工作环境
pyenv virtualenv 2.7.13 first_project
#创建项目B的工作环境
pyenv virtualenv 2.7.13 second_project
#激活项目A的工作环境
pyenv activete first_project
#关闭项目A的工作环境
pyenv deactivate
如果要删除虚拟环境,则使用
pyevn virtualenv-delete first_project