Python 下常用的一个包管理工具就是 pip,今天我在一台服务器上部署 uWSGI 的时候遇到了这么个坑。

uWSGI 的 internal routing 依赖于 pcre,第一次用 pip 安装好后运行 uwsgi 时会出一个 !!! no internal routing support, rebuild with pcre support !!! 的警告,嘛……那我们就安装完 pcre 后重新安装下 uWSGI 好了。

但是重新安装 uWSGI 的时候发现 pip 好像是直接从缓存中拿出了上次编译后的 uwsgi 文件,并没有重新编译一份。于是翻了下 pip 的手册说可以带上 --no-cache-dir 来取消缓存,试了下,OK 了。

但是 pip 的缓存目录到底在哪里呢?

Google 了好久,有人说在 /tmp 下几个 pip 开头的文件里,但是 /tmp 里并没有关键的缓存文件,只有几个压缩包?

最后跟了下 pip 的源码,在 pip.utils.appdirsuser_cache_dir 中可以看见一段注释:

    r"""
    Return full path to the user-specific cache dir for this application.

        "appname" is the name of application.

    Typical user cache directories are:
        Mac OS X:   ~/Library/Caches/<AppName>
        Unix:       ~/.cache/<AppName> (XDG default)
        Windows:      C:\Users\<username>\AppData\Local\<AppName>\Cache

    On Windows the only suggestion in the MSDN docs is that local settings go
    in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the
    non-roaming app data dir (the default returned by `user_data_dir`). Apps
    typically put cache data somewhere *under* the given dir here. Some
    examples:
        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
        ...\Acme\SuperApp\Cache\1.0

    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
    """

缓存目录其实是在当前用户 home 下的 .cache 文件夹里,里面有个 pip 文件夹,删除后,重新安装 uWSGI 时就会重新编译了。

对于 virtualenv 而言,缓存也是在当前操作用户的 .cache 里。