将使用 pip 安装的站点包/模块从较旧版本的 python 迁移到较新/最新版本的 python

Posted

技术标签:

【中文标题】将使用 pip 安装的站点包/模块从较旧版本的 python 迁移到较新/最新版本的 python【英文标题】:Migrate site-packages/modules installed with pip from older to newer/latest version of python 【发布时间】:2020-11-03 03:26:06 【问题描述】:

一开始,我将安装在/../python3.7/site-packages中的python模块手动移动到了新的/../python3.8/site-packages目录中。

为了概括以下问题,我引入以下命名法:初始(较低)python 版本将由 3.x 表示,较新版本由 3.y 表示。 在我的例子中,x=7 和 y=8。

在手动将 3.x 站点包移动到 3.y 站点包目录后,我发现在使用新的 python 版本 3.y 执行 python 脚本时,在调用特定模块时出现某些错误,例如 @987654324 @、scipymatplotlib 等。 最后为我完成的非常不雅的解决方法只是python -m pip uninstall packagename,然后是python -m pip install packagename,即简单地卸载,然后重新安装它。这样,错误就消失了。 幸运的是,我不必对所有 100 多个包都执行此操作,仅 10 个左右的包就相当必要了。

不过,对于未来,我想知道如何更优雅地将软件包从前者迁移到当前的 python 版本,并在需要的地方自动更新。


系统细节:

操作系统:Linux Ubuntu 18.04 LTS Python:Python 3.8.3(默认,2020 年 7 月 9 日,19:37:58) [GCC 5.4.0 20160609] 在 Linux 上 (通过linuxbrew / homebrew 维护) 编辑:VS Code

【问题讨论】:

当。我希望有人回答了这个问题。我现在有完全相同的问题。你是如何让 Pip 将新下载的东西安装到 3.8/ 而不是 3.7/ 的? 下面的讨论会让你感兴趣,pip 将在哪里安装包:***.com/questions/29980798/… 在我的例子中,pip 自动指向最新的 python 站点包目录。这也与我设置的环境变量有关。然后,使用python -m pip install packagename(优先于pip install packagename)。 @FrankYellin 我终于找到了解决方案,请参阅下面的答案。 【参考方案1】:

我找到了一个结合this answer 和更改我的两个配置文件中的PYTHONPATH 的解决方案:

/home/user/.bashrc 
/home/user/.bash_profile

命名法:初始(较低的)python-version 将由 3.x 表示,较新的一个由 3.y 表示。


注意关于之前修改PYTHONPATH的必要性:

在我的例子中,由于有许多python-versions 以各种方式和位置安装,因此需要将目标站点包目录添加到整个PYTHONPATH 中的每个其他目录之前, 因为只有这样提取的python-modules 才能通过python -m pip install --user -r packages_python_3_x.txt 安装在正确的目录中。

如果在您的系统上,PYTHONPATH 直接指向期望的站点包,即它们位于整个 PYTHONPATH 的第一个位置,您不需要修改它。 此外,如果您正在使用虚拟环境(例如pyenv)或其他环境管理器,您将能够自动分离与每个虚拟环境关联的每个站点包。那么,应该也不需要修改PYTHONPATH。相比之下,我没有使用virtual, local and global python environments,这就是为什么我有必要将感兴趣的站点包目录添加到PYTHONPATH。现在,我正在为不同的项目使用虚拟环境,我向大家推荐。


1.) 准备 PYTHONPATH(如果需要)

继续上述配置文件,在其中插入以下行:

PYTHONPATH="/home/linuxbrew/.linuxbrew/lib/python3.x/site-packages:$PYTHONPATH"

如果有类似的行指向以前的 python-version 目录,请根据您的情况将其替换为最新的行(例如,在目录路径中将3.7 替换为3.8)。

此外,如果系统python3-path 被添加到PYTHONPATH 之前,请将该注释注释掉,以便为您的python 分发(无论是homebrewanaconda 或任何您喜欢的)提供优先权。

# NOTE on the following commando: it is commented out on purpose (you could also delete it from the config-files, if you don't consider to use these site-packages again, but I kept it for playing safe)
#export PYTHONPATH="/usr/lib/python3/dist-packages:$PYTHONPATH"

为了使更改立即生效,请在您的 UNIX 终端中执行以下命令:

source /home/user/.bash_profile 
source /home/user/.bashrc

2.) 提取当前安装的模块并使用新版本 3.y 重新安装它们

最后,将安装的所有python-packages 解压到一个文本文件中。在我的例子中,这是使用pip 完成的,所以这将是:

python -m pip freeze --path /home/linuxbrew/.linuxbrew/lib/python3.x/site-packages > packages_python_3_x.txt

文本文件应包含如下行:

absl-py==0.11.0
access==1.1.1
affine==2.3.0
aiohttp==3.7.2
aiohttp-cors==0.7.0
...

最后,(重新)将所有这些包安装到最新的 site-packages 文件夹中(这里使用 pip 完成):

python -m pip install --user -r packages_python_3_x.txt

包管理器 pip 应该选择正确的文件夹,因为您之前已经更新了 PYTHONPATH。 此示例中的新站点包目录应为/home/linuxbrew/.linuxbrew/lib/python3.y/site-packages

【讨论】:

以上是关于将使用 pip 安装的站点包/模块从较旧版本的 python 迁移到较新/最新版本的 python的主要内容,如果未能解决你的问题,请参考以下文章

pip 安装在全局站点包而不是 virtualenv

python中如何安装SciPY模块

Python-在没有网络的情况下pip超时无法下载包时解决包的安装

即使使用较旧的 spark 版本,也没有名为“pyspark.streaming.kafka”的模块

Java SE 模块从 Netbeans 6.5.1 到 7.0 的转换

windows下如何安装pip