升级系统python后pip检测不到用户安装的包?

升级系统python后pip检测不到用户安装的包?

我在 Fedora KDE (x64) PC 上使用 Python。我以前使用的是 Fedora 25,并且使用 安装了 Python 3.5 sudo dnf install python3,以及几个软件包,例如numpyscipy使用 等命令sudo dnf install python3-numpy。现在 Fedora 存储库中并非所有合适的软件包或版本都可用,因此我仅通过 安装了这些软件包或~/.local/lib/python3.5/site-packages/版本pip3 install <packagename> --user

很快,我将 Fedora 升级到了 28 版,在此期间,我python3又升级到了 3.6 版。所有其他python3-*软件包也都进行了适当的升级。现在 pip3 无法识别任何用户安装的软件包,如pip3 list --user,根本不返回任何输出。但~/.local/lib/python3.5/site-packages/目录仍然存在,并且包含一堆软件包。

现在我不知道我该做什么......

  • 如果我确切知道可以删除的内容site-packages,我也许可以删除 的内容?然后我可以重新调查现在真正需要通过 pip 安装哪些软件包。
  • 我可以将其重命名~/.local/lib/python3.5~/.local/lib/python3.6
  • 还有其他方法可以让 pip 导入旧用户安装的 python 包的内容吗?

我有点不知道该如何继续。

答案1

如果你仍然有 Python 3.5,这应该是一件非常容易的事情:

$ pip3.5 list --user --format=freeze | xargs pip3.6 install --user

将重新安装 Python 3.6 的所有用户站点包。当旧的 Python 安装消失时,事情会变得有点复杂(所以pip3.5在你的情况下不会),但仍然没有什么是你无法管理的。首先,检查用户站点是否仍然存在,以便您可以使用它:

$ find ~/.local -type d -name "site-packages" | grep python3.5
/Users/hoefling/.local/lib/python3.5/site-packages

现在使用pkg_resources列出该用户站点中可用的发行版:

$ find ~/.local -type d -name "site-packages" | grep python3.5 | xargs python3.6 -c "import pkg_resources, sys; print(' '.join((f'{pkg.project_name}=={pkg.version}' for pkg in pkg_resources.find_distributions(sys.argv[1]))))"
wheel==0.30.0

用户站点目录将通过管道传输到 Python 代码行,该代码行将使用pkg_resources.find_distributions函数扫描目录(参见获取或创建分布pip文档中的部分)与底层使用的相同,IIRC。我只是添加了一些格式,以便您可以pip3.6在扩展单行代码的最后一次迭代中将输出传递给新的。完整的单行代码是:

$ find ~/.local -type d -name "site-packages" | grep python3.5 | xargs python3.6 -c "import pkg_resources, sys; print(' '.join((f'{pkg.project_name}=={pkg.version}' for pkg in pkg_resources.find_distributions(sys.argv[1]))))" | xargs pip3.6 install --user

pkg_resources是软件包的一部分setuptools,应该已经预先安装好了(至少在使用安装程序时是这样的https://www.python.org/downloads/)。如果没有,setuptools请先安装:

$ dnf install python3-setuptools

相关内容