一、1秒钟启动一个下载服务器
在实际工作中,时常会有这样的一个需求:将文件传给其他同事。将文件传给同事本身并不是一个很繁 琐的工作,现在的聊天工具一般都支持文件传输。但是,如果需要传送的文件较多,操作起来就会比较 麻烦。此外,如果文件在远程的服务器上,则需要先将远程服务器的文件下载到本地,然后再通过聊天 工具传给同事。再或者,你并不是特别清楚要传哪几个文件给同事,所以,你们需要进行交流,而交流 的时间成本是比较高的,会降低办事效率。
此时,如果你知道Python内置了一个下载服务器就能够显著提升效率了。例如,你的同事要让你传的文 件位于某一个目录下,那么,你可以进入这个目录,然后执行下面的命令启动一个下载服务器:
python -m SimpleHTTPServer
在Python 3中,由于对系统库进行了重新整理,因此,使用方式会有不同:
python -m http.server
执行上面的命令就会在当前目录下启动一个文件下载服务器,默认打开8000端口。完成以后,只需要将 IP和端口告诉同事,让同事自己去操作即可,非常方便高效。
使用浏览器访问Python启动的下载服务器,可以看到一个类似于FTP下载的界面,这个时候单击文件下 载即可。通过这种方式传输文件,可以降低大家的沟通成本,提高文件传输的效率。
上面使用的Python语句,从工作原理来说,仅仅是启动了一个Python内置的Web服务器。如果当前目 录下存在一个名为index.html的文件,则默认显示该文件的内容。如果当前目录下不存在这样一个文 件,则默认显示当前目录下的文件列表,也就是大家看到的下载服务器。
测试
进入cmd进入一个目录输入python -m http.server
即可
二、字符串转换为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@python ~]# 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@python ~]# python -c "import paramiko"
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named paramiko
[root@python ~]#
四、pip高级用法
为了便于用户安装和管理第三方库和软件,越来越多的编程语言拥有自己的包管理工具,如nodejs的 npm,ruby的gem。Python也不例外,现在Python生态主流的包管理工具是pip。
1、pip介绍
pip是一个用来安装和管理Python包的工具,是easy_install的替代品,如果读者使用的是Python 2.7.9+或Python 3.4+版本的Python,则已经内置了pip,无须安装直接使用即可。如果系统中没有安装 pip,也可以手动安装。
2、python3安装pip
方法1:python3安装完成后默认已经带有pip3
[root@python bin]# pip3 -V pip 19.2.3 from /usr/local/python38/lib/python3.8/site-packages/pip (python 3.8)
[root@python bin]# pwd
/usr/local/python38/bin
[root@python bin]#
你可以用以下命令,创建软链接
ln -s /usr/local/python38/bin/pip3 /usr/bin/pip
方法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 request
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
3、给pip3重命名
切换至家目录,通过.bashrc添加别名
[root@python bin]# cd ~
[root@python ~]# vim .bashrc alias pip=pip3
[root@python ~]# source .bashrc
[root@python ~]# pip -V
pip 19.2.3 from /usr/local/python38/lib/python3.8/site-packages/pip (python 3.8)
4、pip3常用命令
子命令 | 解释说明 |
---|---|
install | 安装软件包 |
download | 下载软件包 |
uninstall | 卸载安装包 |
freeze | 按照requirements格式输出安装包,可以到其他服务器上执行pip install -r requirements.txt直接安装软件 |
list | 列出当前系统中的安装包 |
show | 查看安装包的信息,包括版本、依赖、许可证、作者、主页等信息 |
check | 检查安装包依赖是否完整 |
search | 查找安装包 |
wheel | 打包软件到wheel格式 |
hash | 计算安装包的hash值 |
completion | 生成命令补全配置 |
help | 获取pip和子命令的帮助信息 |
5、加速pip安装的技巧(linux)
如果大家使用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@python ~]# mkdir .pip
[root@python ~]# cd .pip
[root@python .pip]# touch pip.conf
[root@python .pip]# vim pip.conf
[global]
index-url = https://pypi.douban.com/simple/
[root@python .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
6、在windows环境下修改pip镜像源的方法(以python3.5为例)
(1):在windows文件管理器中,输入 %APPDATA%``
(2):会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件
(3):在新建的pip.ini文件中输入以下内容,搞定文件路径:"C:\Users\Administrator\AppData\Roaming\pip\pip.ini"
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com