pip的使用心得

前言

从大四开始接触Python,感觉这语言还行,但是其中的pip说实话折磨了我半天,不是下载有问题就是安装报错,反正当时看到一片红,非常烦躁,当时也没时间去好好了解下,现在稍微有点空闲打算来补一补。

什么是PIP

本质上pip仅仅是一个程序,它会随着你下载Python而一并安装到你的电脑上,默认的目录是Python安装目录下面的Scripts目录下面,所以你只需要把这个目录加入到环境变量,你就能使用它了。

windows下面只需要在命令行输入where pip即可知道这个程序的绝对路径了。而在linux下只需要whereis pip 即可看到它的位置。

在windows下面这是一个可执行程序,而在linux下可以看到它仅仅是一个Python脚本,内容如下(会略微有出入):

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python
# GENERATED BY DEBIAN

import sys

# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
sys.exit(main())

可以看到其实就是从pip这个包里面引入了它的main方法并且执行而已。

pip安装速度太慢

这个是很多人在使用pip遇到的第一个问题,pip安装第三方库的流程是这样的:首先去网站上找到目标库,下载下来,然后安装到你电脑的指定位置(可以用pip -V看到这个指定的位置)。(当然也是有缓存机制的,但是这里按下不表)

那这个问题的成因也非常简单,因为默认使用的是国外的源,所以速度就不太行,于是就有以下几种解决方案:

解决方法一:换源

从国外的源下载真的慢,还有可能甚至完全下载不了,但是好在国内有不少优秀的源,只需要你下载的时候指定一下就可以了,这里推荐几个不错的源:

比如下载requests库的时候,只需要pip install requests -i http://pypi.douban.com/simple/ 指定一下即可。

至于httpshttp之间的区别,如果你用的是http,那么会出现警告,并且不让你下载,你需要根据它的提示在后面加上一个--trusted-host pypi.douban.com这样即可。

解决方法二:使用代理

只需要下载的时候指定即可:pip install requests --proxy 127.0.0.1:1081,怕小白不清楚然后用了没效果,这里先声明:如果你不懂代理是什么,请不要使用这条。

解决方法三:手动下载

pip安装第三方库的原理就是它帮你从特定网站上下下来.whl文件,然后帮你安装上去而已,而为什么会慢就是因为下载的包的比较慢,所以我们完全可以自己去下载(或者直接问别人要),这里一般是去https://pypi.org/这个网站上搜索你要的,然后下载下来。但是下载的时候你会发现有非常多的文件,选哪一个呢?

image-20191229154807359

第一个是软件包的名字和版本号,第二个是对应的python版本,上图中就是适合python2.7的,最后一个是适合的机器,照着自己的机器选就行了。

下载下来之后只需要定位到那个文件,然后在cmdpip install xxx.whl即可安装。

pip安装权限问题

如果说上面仅仅是“慢”,还不算致命的错误的话,那接下来的问题就有点严重了,在你等待了半天的情况下,终于下载完了,然后突然给你来一波:

image-20191229152142106

然后你心态就炸了。我那时候是为了爬虫下的Python,然后首先我下载requests就等了半天了,最后突然给我来这么一出,气得我直接把Python直接删了。(PS:如果你Python安装在C盘基本会出现这个问题,但是别的盘就不会)

好了我们这里来分析一下这是为什么。从提示上来看呢,说的是权限问题。那么我们就看看为什么会有权限问题,首先打开cmd,然后输入whoami 或者输入 echo %username%就能知道当前的用户了。

接着我们输入pip -V,会显示出pip装在了你电脑的哪里,那个前面的目录就是pip默认下载的模块的位置了,我这里是C:\Program Files\Python38\Lib\site-packages,问题就出在这里了:

image-20191229153300885

我们只有读取和执行的权限,却没有写入修改的权限。这也就是为什么会报错的原因。

理解了原因了,那么处理方式就很简单了:

  1. 使用管理员权限运行cmd来执行pip命令,较为推荐
  2. 修改site-packages的权限,让自己能够完全控制,很推荐,一劳永逸
  3. 重新安装Python到别的路径下面
  4. 在安装的时候使用--user选项

pip导出、导入第三方库

在你逛github上面的Python项目的时候,你可能会发现里面有一个叫requirements.txt的文件,打开来也很好理解,就是各种库和它们的版本,你只需要使用pip install -r requirements.txt就可以安装这个文件中所有的相对应的库了,然后你就可以愉快使用他们的项目了。

当然你也可以使用pip freeze requirements.txt来导出你当前使用的Python库的环境,非常方便。

pip配置

pip有一个自己的配置文件,默认是不存在的,需要自己创建,你可以在里面写上各种各样自定义的需求,比如定义好源,这样以后就可以不用每次都在命令行里面加入你需要的设置了。

不同平台下的配置文件位置不同:

  • windows下:%APPDATA%\pip\pip.ini
  • linux下:$HOME/.config/pip/pip.conf
  • macOS下:$HOME/Library/Application Support/pip/pip.conf,当前面那个不存在时,使用$HOME/.config/pip/pip.conf

我的配置文件内容:

1
2
3
4
[global]
timeout = 6000
index-url = http://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com

只是简单设置了阿里云的镜像而已。当然是以命令行的为准,如果命令行里没写才以这个为准的。

ZSH下安装问题

因为需要使用socks代理来爬取一些东西,就需要安装requests库中的socks,在zsh下输入:pip install requests[socks],会提示zsh: no matches found: requests[socks],这是因为在zsh里方括号是用来glob模式匹配的。

解决方法也很简单,只需要单引号引起来就不要紧了。pip install 'requests[socks]' 即可。当然你也可以在你的命令前面加上noglob也可以。