使用pip更新用户安装的包

3 投票
3 回答
3153 浏览
提问于 2025-04-21 06:45

我在做研究的时候,使用了一些Python的包,这些包是通过pip的--user选项安装在我自己的目录里的。此外,还有一些包是通过我操作系统的包管理工具安装的,主要是为了其他用途。我想要一个pip命令,只升级我自己用--user选项安装的那些包。

我试过推荐的命令pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs pip install -U,但这个似乎只在虚拟环境中有效。pip freeze --local显示的包包括了我用户安装的和系统范围内的包。

有没有办法只升级那些我本地安装的包呢?

3 个回答

0

我建议你如果可以的话,创建一个虚拟环境。

你只需要用 sudo apt-get install python-virtualenv 来安装 virtualenv,然后进入你存放 Python 项目的文件夹,在终端输入 virtualenv venv。接下来,你可以用 source venv/bin/activate 来激活它。

这样做的好处是,它会创建一个几乎完整的 Python 复制品(有些库是链接的,以节省空间),在你激活之后所做的所有操作只会影响这个复制品,而不会影响全局环境。因此,你可以使用 pip 安装任何库,更新它们等等,而不会改变虚拟环境外的任何东西。不过,记得在做任何事情之前先激活它哦。

4

你可以用这个简单的命令来升级用户安装的包:

pip freeze --user | cut -d'=' -f1 | xargs pip install --user -U
3

我也遇到过这个问题,所以写了一个脚本。这个脚本会更新用户主目录下通过pip安装的所有包。通常,这些包是用 pip install --user 命令安装的。

#!/usr/bin/env python

# Starting point for this script:
# http://stackoverflow.com/a/5839291

import os
import subprocess
import pkg_resources

HOMEDIR = os.getenv('HOME')
homepkg = []

for dist in list(pkg_resources.working_set):
  if not dist.location.startswith(HOMEDIR):
    continue
  homepkg.append(dist.project_name)

if len(homepkg) == 0:
  print('No locally-installed packages, nothing to update.')
  raise SystemExit

# --no-deps is required because --upgrade by default is recursive and would try
# to update packages that are not from homedir (e.g. from /usr). 

subprocess.call(['pip', 'install', '--user', '--upgrade', '--no-deps'] + homepkg)

撰写回答