将使用 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 @、scipy
、matplotlib
等。
最后为我完成的非常不雅的解决方法只是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 分发(无论是homebrew
、anaconda
或任何您喜欢的)提供优先权。
# 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的主要内容,如果未能解决你的问题,请参考以下文章
Python-在没有网络的情况下pip超时无法下载包时解决包的安装
即使使用较旧的 spark 版本,也没有名为“pyspark.streaming.kafka”的模块