Python内置小工具

1秒钟启动一个下载服务器

在实际工作中,时常会有这样的一个需求:将文件传给其他同事。将文件传给同事本身并不是一个很繁琐的工作,现在的聊天工具一般都支持文件传输。但是,如果需要传送的文件较多,操作起来就会比较麻烦。此外,如果文件在远程的服务器上,则需要先将远程服务器的文件下载到本地,然后再通过聊天工具传给同事。再或者,你并不是特别清楚要传哪几个文件给同事,所以,你们需要进行交流,而交流的时间成本是比较高的,会降低办事效率。

此时,如果你知道Python内置了一个下载服务器就能够显著提升效率了。例如,你的同事要让你传的文件位于某一个目录下,那么,你可以进入这个目录,然后执行下面的命令启动一个下载服务器:

python -m SimpleHTTPServer 

在Python 3中,由于对系统库进行了重新整理,因此,使用方式会有不同:

python -m http.server 

执行上面的命令就会在当前目录下启动一个文件下载服务器,默认打开8000端口。完成以后,只需要将IP和端口告诉同事,让同事自己去操作即可,非常方便高效。

使用浏览器访问Python启动的下载服务器,可以看到一个类似于FTP下载的界面,这个时候单击文件下载即可。通过这种方式传输文件,可以降低大家的沟通成本,提高文件传输的效率。

上面使用的Python语句,从工作原理来说,仅仅是启动了一个Python内置的Web服务器。如果当前目录下存在一个名为index.html的文件,则默认显示该文件的内容。如果当前目录下不存在这样一个文件,则默认显示当前目录下的文件列表,也就是大家看到的下载服务器。

字符串转换为JSON

JSON是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。由于JSON的诸多优点,已被广泛使用在各个系统中。JSON使用越广泛,需要将JSON字符串转换为JSON对象的需求就越频繁。

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

这个需求十分常见,以至于使用搜索引擎搜索"JSON",处于搜索结果的第一项便是“在线JSON格式化工具”。除了打开浏览器,使用在线JSON格式化工具以外,我们也可以使用命令行终端的Python解释器来解析JSON串,如下所示:

[root@oracle ~]# echo '{"job": "developer", "name": "lmx", "sex": "male"}' | python -m json.tool  
{
   "job": "developer",
   "name": "lmx",
   "sex": "male"
}

使用命令行解释器解析JSON串非常方便,而且,为了便于阅读,该工具还会自动将转换的结果进行对齐和格式化。如下所示:

[root@oracle ~]# echo '{"address": {"province": "zhejiang", "city": "hangzhou"}, "name": "lmx", "sex": "male"}' | python -m json.tool 
{
   "address": {
       "city": "hangzhou",
       "province": "zhejiang"
  },
   "name": "lmx",
   "sex": "male"
}

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

安装完Python的第三方库以后,如何确认这个库已经正确安装了呢?答案很简单,只需要尝试进行import导入即可。如果导入没有任何错误,则认为安装成功;如果导入失败,则认为安装失败。

[root@oracle ~]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

验证Python的第三方库是否安装成功,本身也是一件很简单的事情,但是,如果我们使用脚本对大批量的服务器进行自动部署,又应该如何验证第三方库安装成功了呢?肯定不能登录每一台服务器进行验证。这个时候,我们可以使用Python解释器的-c参数快速地执行import语句,如下所示:

[root@oracle ~]# python -c "import paramiko"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named paramiko
[root@oracle ~]#

pip高级用法

为了便于用户安装和管理第三方库和软件,越来越多的编程语言拥有自己的包管理工具,如nodejs的npm,ruby的gem。Python也不例外,现在Python生态主流的包管理工具是pip。

pip介绍

pip是一个用来安装和管理Python包的工具,是easy_install的替代品,如果读者使用的是Python 2.7.9+或Python 3.4+版本的Python,则已经内置了pip,无须安装直接使用即可。如果系统中没有安装pip,也可以手动安装。

 python3安装pip

方法1:python3安装完成后默认已经带有pip3

[root@oracle bin]# pip3 -V
pip 19.2.3 from /usr/local/python38/lib/python3.8/site-packages/pip (python 3.8)
[root@oracle bin]# pwd
/usr/local/python38/bin
[root@oracle bin]#

你可以用以下命令,创建软链接

ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3

方法2:使用以下方法重新安装pip插件

下载get-pip.py脚本

wget https://bootstrap.pypa.io/3.2/get-pip.py

运行脚本

python3 get-pip.py

python3创建pip3索引

ln -s /usr/python3.6.1/bin/pip /usr/bin/pip3

测试是否安装成功

pip3 install requests

pip之所以能够成为最流行的包管理工具,并不是因为它被Python官方作为默认的包管理器,而是因为它自身的诸多优点。pip的优点有:

pip提供了丰富的功能,其竞争对手easy_install则只支持安装,没有提供卸载和显示已安装列表的功能;
pip能够很好地支持虚拟环境;
pip可以通过requirements.txt集中管理依赖;
pip能够处理二进制格式(.whl);
pip是先下载后安装,如果安装失败,也会清理干净,不会留下一个中间状态。

如果用户没有将软件打包上传到pypi.python.org,则无法使用pip进行安装。对于这种情况,Python生态也有标准的做法,例如,我们尝试从源码安装paramiko。需要注意的是,我们也可以通过pip安装paramiko的,这里只是为了演示Python生态中源码安装:

$ git clone https://github.com/paramiko/paramiko.git  
$ cd paramiko  
$ python setup.py install

给pip3重命名

切换至家目录,通过.bashrc添加别名

[root@oracle bin]# cd ~
[root@localhost ~]# vim .bashrc
alias pip=pip3
[root@localhost ~]# source .bashrc
[root@localhost ~]# pip -V
pip 19.2.3 from /usr/local/python38/lib/python3.8/site-packages/pip (python 3.8)

pip3常用命令

子命令解释说明
install 安装软件包
download 下载软件包
uninstall 卸载安装包
freeze 按照requirements格式输出安装包,可以到其他服务器上执行pip install -r requirements.txt直接安装软件
list 列出当前系统中的安装包
show 查看安装包的信息,包括版本、依赖、许可证、作者、主页等信息
check 检查安装包依赖是否完整
search 查找安装包
wheel 打包软件到wheel格式
hash 计算安装包的hash值
completion 生成命令补全配置
help 获取pip和子命令的帮助信息

加速pip安装的技巧

如果大家使用Python的时间比较长的话,会发现Python安装的一个问题,即pypi.python.org不是特别稳定,有时候会很慢,甚至处于完全不可用的状态。这个问题有什么好办法可以解决呢?根据笔者的经验,至少有两种不同的方法。

1.使用豆瓣或阿里云的源加速软件安装

访问pypi.python.org不稳定的主要原因是因为网络不稳定,如果我们从网络稳定的服务器下载安装包,问题就迎刃而解了。我们国内目前有多个pypi镜像,推荐使用豆瓣的镜像源或阿里的镜像源。如果要使用第三方的源,只需要在安装时,通过pip命令的-i选项指定镜像源即可。如下所示:

pip install -i https://pypi.douban.com/simple/ flask 

每次都要指定镜像源的地址比较麻烦,我们也可以修改pip的配置文件,将镜像源写入配置文件中。对于Linux系统来说,需要创建~/.pip/pip.conf文件,然后在文件中保存如下内容:

[root@localhost ~]# mkdir .pip
[root@localhost ~]# cd .pip
[root@localhost .pip]# touch pip.conf
[root@localhost .pip]# vim pip.conf
[global]  
index-url = https://pypi.douban.com/simple/
[root@localhost .pip]#
2.将软件下载到本地部署

如果需要对大批量的服务器安装软件包,并且安装包比较多或者比较大,则可以考虑将软件包下载到本地,然后从本地安装。这对于使用脚本部署大量的服务器非常有用,此外,对于服务器无法连接外网的情况,也可以使用这种方法。如下所示:

# 下载到本地  
pip install --download='pwd' -r requirements.txt  

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

使用这种方式,只需要下载一次,就可以多处安装,不用担心网络不稳定的问题。并且,pip能够自动处理软件依赖问题。例如,我们通过这种方式下载Flask到当前目录下,则Flask的依赖click、itsdangerous、Jinja2、MarkupSafe和Werkzeug也会被下载到本地,如下所示:

pip install --download='pwd' flask  

$ ls  
click-6.7-py2.py3-none-any.whl   itsdangerous-0.24.tar.gz  
MarkupSafe-0.23.tar.gz Flask-0.12-py2.py3-none-any.whl  
Jinja2-2.9.5-py2.py3-none-any.whl Werkzeug-0.11.15-py2.py3-none-any.whl
posted on 2020-06-27 20:25  痴人_说梦  阅读(83)  评论(0编辑  收藏  举报