鉴于我华夏大陆的情况,使用 pip install
从 PyPI
官方仓库安装第三方包总是慢吞吞的,好在国内很多公司都提供了 PyPI
仓库的官方镜像,方便了我们劳苦的 Python 开发者
如果要使用 PyPI
的国内镜像,我们就不得不作出一些配置,然后,我想了想,要不,索性,就把 pip
会使用到的配置文件也详细说明一下,这,就是本章节的愿景
pip 配置
配置文件
Pip 允许在标准的 .ini
格式配置文件中设置所有命令行选项的默认值
当我看到这句话时心里咯噔了一下,这意味着什么,这意味着三位一体配置法
- 首先,对于所有的命令行参数,都有默认的配置项
- 其次,可以在
ini
配置文件中覆盖这些默认的配置 - 再次,可以在使用命令时,传递一些参数来覆盖前两者的默认设置
这几乎是所有标准的参数的设置格式,但我们实际开发时,往往忽略了某些部分
ini
配置文件的名称和存放位置在不同平台上略有不同,而且拥有 用户
( per-user ),虚拟环境
( per-virtualenv ) 和 机器
( site ) ( 在所有用户之间共享 ) 三个级别的配置
-
用户级别 ( per-user )
-
在 Unix 上,配置文件名称是
pip.conf
,而默认的存放位置为$HOME /.config/pip/pip.conf
,.config
目录的位置由XDG_CONFIG_HOME
环境变量来指定 -
在 macOS 上,配置文件名称是
pip.conf
,而对于存放目录,如果存在$HOME/Library/Application Support/pip
目录,则配置文件的存放位置为$HOME/Library/Application Support/pip/pip.conf
,否则为$HOME/.config/pip/pip.conf
-
在 Windows 上,配置文件名称是
pip.ini
,保存位置一般是%APPDATA%\pip\pip.ini
另外,对于用户级别的配置文件,还存在一个惯例上的保存位置,它们是
-
在 Unix 和 macOS 系统上,为
$HOME/.pip/pip.conf
-
在 Windows 系统上,为
%HOME%\pip\pip.ini
这些保存位置并不是固定一层不变的,我们可以使用
PIP_CONFIG_FILE
环境变量来重新设定,例如在 macOS 下可以使用export PIP_CONFIG_FILE=$HOME/.env/pip.conf
-
-
虚拟环境 ( virtualenv )
对于一个虚拟环境中,比如使用
virtualenv
或pyenv
创建的虚拟环境中,配置文件的名称和保存位置分别为-
在 Unix 和 macOS 系统上,为
$VIRTUAL_ENV/pip.conf
-
在 Windows 系统上,为
%VIRTUAL_ENV%\pip.ini
-
-
**机器 ( site ) 级别
-
在 Unix 上,该文件可能位于
/etc/pip.conf
中。或者,可能位于环境变量XDG_CONFIG_DIRS
( 如果存在 )中设置的任何路径的 「 pip 」子目录中,例如/etc/xdg/pip/pip.conf
-
在 macOS 系统上,该文件位于
/Library/Application Support/pip/pip.conf
-
在 Windows XP 系统上,该文件位于
C:\Documents and Settings\All Users\Application Data\pip\pip.ini
-
在 Windows 7 及以后的版本中,该文件是一个隐藏文件,位于
C:\ProgramData\pip\pip.ini
-
对于
Windows Visa
系统,对了,不支持站点级别的配置文件
-
如果 Pip 在以上三个级别的多个位置找到了多个配置文件,则会按照以下的顺序组合它们
- 首先,读取 机器 级别的配置文件
- 然后,读取 用户 级别的配置文件,并覆盖 机器级别 相关的配置,一般情况下,这是最终的配置
- 最后,如果使用的是虚拟环境,则继续读取 虚拟环境 的配置文件
每个文件读取都会覆盖从先前文件读取的任何值,因此如果在机器范围文件和每用户文件中都指定了全局超时,则后一个值将是将使用的值
对于 ini
配置文件中的每个配置项,名称都是命令行参数的长命令行选项,例如,我们想要使用一个不同的包索引 ( --index-url
),比如豆瓣的 https://pypi.douban.com/simple
,然后再设置 HTTP 超时 ( --default-timeout
) 为 60s
,则我们的配置文件可能如下
[global] timeout = 60 index-url = https://pypi.douban.com/simple
每个 pip
子命令都可以在它们自己的段内可选的配置一些项目,以便覆盖具有相同名称的全局设置
例如我们把所有命令的超时时间设置为 60s
,这个必须在 [global]
段内,这样才能影响到全部的命令,而对于 pip freeze
子命令,10s
的超时足矣,则可以在 [freeze]
对内配置
[global] timeout = 60 [freeze] timeout = 10
对于布尔值的命令行可选参数,比如 --ignore-installed
或 --no-cache-dir
,它们的值为 true
或 false
[global] no-cache-dir = false [install] ignore-installed = true
而对于是否启用的命令行可选参数,比如 --no-dependencies
或 --no-compile
,它们的值为 yes
或 no
[install] no-dependencies = yes no-compile = no
对于可以追加多个值的命令行可选参数,比如 --find-links
可以写在多行上
[global] find-links = http://download.example.com [install] find-links = http://mirror1.example.com http://mirror2.example.com
环境变量
Pip 的命令行参数还可以使用诸如 PIP_<UPPER_LONG_NAME>
的环境变量的方式来设置,所有可选参数中的破折号 ( -
) 需要替换为下划线 _
例如,设置默认的超时时间,可以如下
export PIP_DEFAULT_TIMEOUT=60
这与直接使用命令行参数 --default-timeout
设置相同
pip --default-timeout=60 [...]
对于可以重复的命令行选项,请使用空格分隔多个值。例如:
export PIP_FIND_LINKS="http://mirror1.example.com http://mirror2.example.com"
下面的方式则跟上面的相同
pip install --find-links=http://mirror1.example.com --find-links=http://mirror2.example.com
配置优先级
在这么多种设置中,命令行选项优先于环境变量,环境变量优先于配置文件
也就是说,命令行选项会覆盖环境变量,环境变量会覆盖配置文件
而在配置文件中,特定命令段的优先级高于全局部分
例如:
--host=foo
会覆盖PIP_HOST=foo
PIP_HOST=foo
会覆盖配置文件中的[global]
段中的host=foo
- 配置文件特定命令段
[<command>]
内的host=bar
会覆盖全局段[global]
内的host = foo