使用pip更新用户安装的包
我在做研究的时候,使用了一些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)