python - 由于 python 版本不匹配(3.8.5 与 3.8.6)导致包含 python 模块的问题
问题描述
问题背景:
- 我使用了 ubuntu 16.04,我必须从源代码安装 python 3.8。我下载了 python 3.8.6 并进行了 altinstall。它工作正常,但是在将/更新替代 python3 链接到 python 3.8 时,我有可能搞砸了一些事情,现在在 ubuntu 升级后会导致问题。
- 我已经从 python 3.8.5 附带的 16.04 升级到 ubuntu 20.04
问题
升级到 20.04 后,我遇到了一些不匹配的 python 版本(3.8.5 与 3.8.6)的问题,所以我已经从 /usr/local/bin 中删除(我可以恢复它)手动安装的 python 3.8.6。它部分地解决了这个问题。现在
$ which python3
/usr/bin/python3
$ /usr/bin/python3 --version
Python 3.8.5
$ which python3.8
/usr/bin/python3.8
$ /usr/bin/python3.8 --version
Python 3.8.5
然而,当使用使用 python 3.8 的插件运行 vim 时,我看到加载 python 模块的问题,例如:
Traceback (most recent call last):
File "/usr/lib/python3.8/subprocess.py", line 64, in <module>
import msvcrt
或更少冗长:
YouCompleteMe unavailable: No module named '_socket'
vim 中还有什么:
:py3 print( __import__( 'sys' ).version )
结果:
3.8.6 (default, Nov 2 2020, 13:09:31)
[GCC 5.4.0 20160609]
这表明 python3.8.6 和 python3.8.5 存在问题
我绑定的内容:
- sudo apt reinstall python3 python3-dev python3.8 python3.8-dev
- sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
- 通过将 python 3.8.6 留在 /usr/local/bin/ 中并临时删除 /usr/bin/python3* ,问题可能是 W/A ,但这不是好的长期解决方案。
感谢任何提示。摆脱手动安装的 python 3.8.6 可能会完成这项工作,但不确定是否可行。此外,通过 apt remove 删除 python3(再次从头开始安装)可能是不可能的,因为我只有远程 ssh 访问该机器并预计会出现一些问题。
解决方案
正如预期的那样,问题与 python 3.8.6(从源代码安装)与 python 3.8.5(默认情况下与 ubuntu20.04 一起提供)有关。
# ldd /usr/bin/vim | grep python
libpython3.8.so.1.0 => /usr/local/lib/libpython3.8.so.1.0 (0x00007f1ef9212000)
这是在手动构建期间安装的库,并指向 python 3.8.6,而所有 vim 插件都是使用默认的 python 3.8.5 构建的。后
sudo mv /usr/local/lib/libpython3.8.so.1.0 /usr/local/lib/temp-libpython3.8.so.1.0
使用的库指向:
ldd /usr/bin/vim | grep python
libpython3.8.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0 (0x00007fa50896e000)
这解决了这个问题。此外,现在在 vim 中,我可以看到使用了 python 3.8.5 而不是 3.8.6:
:py3 print( __import__( 'sys' ).version )
3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0]
推荐阅读
- javascript - Calling Javascript function from external file when loading html page
- c# - 使用 datatable() 计算 C# 表单文本框字符串
- csv - PySpark:如何用逗号指定列作为十进制
- android - Android - 模拟问题
- javascript - 我想知道这个函数到底做了什么 .split(' ').map(x => +x);
- javascript - React setState prevState 参数和 Array#map
- java - 是否可以在 java 中将 int 归因于 String?
- javascript - 禁用胡佛,重新启用,但点击不会再次工作
- android - BLE SCAN_FAILED_ALREADY_STARTED(错误代码 1)仅在某些设备上
- typescript - 打字稿:是否可以从参数值推断返回值?