Chapter 2 Python生态工具 《Python Linux系统管理与自动化运维》

Python 生态工具

工欲善其事,必先利其器,掌握主流实用工具,优点很多,可以显著提升编程效率,形成统一代码风格,通过工具自学Python,任意切换 / 管理不同工作环境等。

2.1 Python 内置小工具

内置下载服务器

python -m SimpleHTTPServer
python -m http.server # python3 

执行上述命令,会在当前目录下启动一个文件下载服务器,默认打开8000端口。

字符串转换为 json

工作中,系统会调用底层服务的 API。底层服务的 API 一般都是以 JSON 格式返回,为了便于问题追踪,会将 API 返回的 JSON 转换为字符串记录到日志文件中。当需要分析问题时,需要将日志文件中的 JSON 字符串拿出来进行解析。即需要将一个 JSON 字符串转换为 JSON 对象,以提高日志的可读性。

[baiyongan@bya ~]$ echo '{"address": {"province": "jiangsu", "city": "nanjing"}, "name": "baiyongan", "role": "superman"}' | python -m json.tool
{
    "address": {
        "city": "nanjing",
        "province": "jiangsu"
    },
    "role": "superman",
    "name": "baiyongan"
}

#  前面是json 字符串,后面接管道与python -m json.tool

检查第三方库是否正确安装

如果使用脚本对大批量的服务器进行自动部署,可以使用python解释器的 -c 参数快速地执行import 语句。

最关键——可以在脚本中实现对远程服务器地验证操作。

2.2 pip 高级用法

pip常用命令

子命令 功能
install 安装 如:pip install flask==0.8 安装特定版本
download 下载
uninstall 卸载
freeze 按照requirements 格式输出安装包,pip freeze > requirements.txt 可以到其他服务器上执行 pip install -r requirements.txt 直接安装软件
list 列出当前系统中的安装包
show 查看安装包的信息:版本、依赖、许可证、作者、主页等
check 检查安装包的依赖是否完整
search 查找
wheel 打包软件到wheel格式
hash 计算安装包的hash值
completion pip completion --bash >> ~/.profile $ source ~/.profile 通过键入'pip i<tab>',将会自动输入 'pip install'
help 获取pip 和子命令的帮助信息

如何加速pip的安装

方法一:更改镜像源

豆瓣:http://pypi.douban.com/simple/

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/

临时使用,如下:只有安装pillow时使用指定源

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow

永久修改,修改配置文件

  • Linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple

  • windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下:
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple

  • PyCharm 中更改镜像源

    File >> Settings >> Project >> Project Interpreter >> (右侧边缘 + 号) Available Packages >> Manage Repositories >> 右侧边缘加号 >> input a repository URL >> 清华、豆瓣等

方法二:将软件下载到本地部署

如果服务器无法连接外网,且安装包较多较大,可以先将包下载到本地,然后从本地安装。

# 下载到本地
pip install --download='pwd' -r requirements.txt
# 本地安装
pip install --no-index -f file://'pwd' -r requirements.txt

2.3 Python编辑器

Linux 用 vim:代码补全插件 snipmate、语法检查插件 Syntastic、编程提示插件 jedi-vim

windows 用Pycharm

2.4 Python 编程辅助工具

Python 交互式编程:IPython Shell 和 jupyter (IPython Notebook)
IPython: 略

jupyter:略

2.5 Python 调试器

单步调试 标准库 的pdb 以及第三方库ipdb

ipdb 之于pdb,就相当于 IPython 之于Python

标准库的pdb:部分调试命令

一种是直接在命令行参数指定使用pdb模块启动python 文件,适用于文件较短的程序

python -m pdb test_pdb.py

另一种,直接在代码中,调用set_trace方法设置断点,适用于程序文件较大的场景

from __future__ import print_function
import pdb
import ipdb

def sum_nums(n):
    s = 0
    for i in range(n):
    pdb.set_trace()
    # ipdb.set_trace()
    s += i
    print(s)

if __name__ == '__main__':
    sum_nums(5)

2.6 Python 代码规范检查

PEP8 编码规范 : 对齐规则、包导入顺序、空格与注释、命名习惯、异常处理等

google Python 编码风格

  • pycodestyle 检查代码规范
[root@bya Test_Project]# cat test.py 
import os,sys

def main():
    print([ITEM FOR ITEM IN OS.LISTDIR('.') if item.endswith('.py')]);
    print(  sys.version)

if __name__ == __main__:
    main()
[root@bya Test_Project]# pycodestyle --show-source test.py # 使用 --show-source 显示出错源码
test.py:1:10: E231 missing whitespace after ','
import os,sys
         ^
test.py:1:10: E401 multiple imports on one line
import os,sys
         ^
test.py:3:1: E302 expected 2 blank lines, found 1
def main():
^
test.py:4:70: E703 statement ends with a semicolon
    print([ITEM FOR ITEM IN OS.LISTDIR('.') if item.endswith('.py')]);
                                                                     ^
test.py:5:11: E201 whitespace after '('
    print(  sys.version)
          ^
test.py:7:1: E305 expected 2 blank lines after class or function definition, found 1
if __name__ == __main__:
^
[root@bya Test_Project]# 

  • 使用autopep8 将代码格式化
autopep8 --in-place test.py # 相当于sed 里面的-i 选项,直接将修改结果保存到源文件中
# autopep8 还有--aggressive 选项,使用该选项, 会执行更多实质性的更改,多次使用,效果更佳。
  • pylint 代码审查工具

2.7 Python 工作环境管理

pyenv 用于管理不同的Python 版本:如工作时用Python 2.7.13, 学习时用Python 3.6.0

virtualenv 用于隔离不同项目的工作环境:如都在Python 2.7.13 中,项目A用flask 0.8,项目B用flask 0.9

组合使用pyenv 和virtualenv,就能够构造Python 和第三方库的任意版本组合。

virtualenv是一个独立工具,用户可以不用pyenv, 而单独用virtualenv,但如果用了pyenv,则需要安装pyenv-virtualenv插件。

  • 安装 pyenv
[root@bya Test_Project]# git clone https://github.com/yyuu/pyenv.git ~/.pyenv
Cloning into '/root/.pyenv'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 17972 (delta 9), reused 10 (delta 3), pack-reused 17943
Receiving objects: 100% (17972/17972), 3.55 MiB | 14.00 KiB/s, done.
Resolving deltas: 100% (12236/12236), done.
[root@bya Test_Project]# echo 'export PYENV_ROOT="$HOME"/.pyenv' >> ~/.bash_profile
[root@bya Test_Project]# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
[root@bya Test_Project]# echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
[root@bya Test_Project]# source ~/.bash_profile 
[root@bya Test_Project]# pyenv --help
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command
   hooks       List hook scripts for a given pyenv command
   init        Configure the shell environment for pyenv
   install     Install a Python version using python-build
   local       Set or show the local application-specific Python version(s)
   prefix      Display prefix for a Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   root        Display the root directory where versions and shims are kept
   shell       Set or show the shell-specific Python version
   shims       List existing pyenv shims
   uninstall   Uninstall a specific Python version
   version     Show the current Python version(s) and its origin
   --version   Display the version of pyenv
   version-file   Detect the file that sets the current pyenv version
   version-name   Show the current Python version
   version-origin   Explain how the current Python version is set
   versions    List all Python versions available to pyenv
   whence      List all Python versions that contain the given executable
   which       Display the full path to an executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme
[root@bya Test_Project]# 

  • pyenv 的使用
pyenv install --list # 查看支持版本

pyenv install -v 3.6.0 # 安装某个Python 版本

pyenv versions # 查看当前系统中的Python版本

pyenv global 2.7.5 # 切换至 2.7.5 版本

pyenv uninstall 2.7.5 # 删除2.7.5 版本

  • 安装pyenv-virtualenv插件
[root@bya Test_Project]# git clone https://github.com/yyuu/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
Cloning into '/root/.pyenv/plugins/pyenv-virtualenv'...
remote: Enumerating objects: 2064, done.
remote: Total 2064 (delta 0), reused 0 (delta 0), pack-reused 2064
Receiving objects: 100% (2064/2064), 580.31 KiB | 14.00 KiB/s, done.
Resolving deltas: 100% (1413/1413), done.
[root@bya Test_Project]# echo 'eval "$(pyenv virtualenv-init -)"' >>~/.bash_profile
[root@bya Test_Project]# source ~/.bash_profile 
[root@bya Test_Project]# pyenv help virtualenv
Usage: pyenv virtualenv [-f|--force] [VIRTUALENV_OPTIONS] [version] <virtualenv-name>
       pyenv virtualenv --version
       pyenv virtualenv --help

  -f/--force       Install even if the version appears to be installed already

[root@bya Test_Project]# 



  • 使用pyenv-virtualenv插件
pyenv virtualenv 2.8.5 first_project  # 新建两个工作环境
pyenv virtualenv 2.8.5 second_project

pyenv virtualenvs # 查看工作环境

pyenv activate first_project # 进入一个工作环境
(first_project) $ pip install flask==0.8
(first_project) $ pyenv deactivate # 退出一个工作环境

pyenv virtualenv-delete first_project # 删除一个虚拟环境 

总结

IPython这一块没有写,setuptools 工具也没写。

重点是要知道工具的存在,并且知道哪些工具解决哪些问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343