我在 Windows 10 上使用 Cygwin 64;刚刚更新。一些相关的软件包版本:
- 融合:3.18.0-1
- python3:3.8.6-1
- python2:2.7.18-4
我还使用 MobaXTerm 的 X 服务器(并且它有效 - 例如,我可以运行 xclock。)
当我在 Cygwin bash 会话(在 mintty 内)中运行 meld 时,我得到:
Traceback (most recent call last):
File "/usr/bin/meld", line 71, in <module>
import meld.conf
ModuleNotFoundError: No module named 'meld'
为什么会发生这种情况,我怎样才能正确运行?
笔记:
- 我思考这个问题是这里的主题,但我不太确定;如果不是,请发表评论,我会将其移至 SU 或其他地方。
- 一个相关的问题,实际上在这里更切题......:无法在 ubuntu 16.04 上启动 meld,因为导入 meld.conf 错误。
答案1
meld 似乎硬编码为 python3.6
https://cygwin.com/packages/x86_64/meld/meld-3.18.0-1
但默认指向 3.8
$ alternatives --display python3
python3 - status is auto.
link currently points to /usr/bin/python3.8
/usr/bin/python3.8 - priority 38
/usr/bin/python3.6 - priority 36
/usr/bin/python3.7 - priority 37
Current `best' version is /usr/bin/python3.8.
尝试设置为 3.6
$ alternatives --config python3
There are 3 programs which provide 'python3'.
Selection Command
-----------------------------------------------
*+ 1 /usr/bin/python3.8
2 /usr/bin/python3.6
3 /usr/bin/python3.7
Enter to keep the current selection[+], or type selection number: 2
并再次测试融合
答案2
正如@matzeri 指出的那样,meld 似乎被硬编码为 python 3.6 - 而截至 2021 年 9 月,Cygwin64 将 Python 3.8 作为 python3 的默认替代方案。
现在,我不想更改所有应用程序的默认设置,但是 - 我们仍然可以手动强制融合本身:
- 复制
/usr/bin/meld
到/usr/local/bin/meld
- 在 中
/usr/local/bin/meld
,替换:
#!/usr/bin/python3
和:
#!/usr/bin/python3.6
这至少可以解决缺少模块的问题 - 尽管您可能会遇到其他事宜。
请记住,当您下次更新融合本身时,您有一个本地版本可以删除/更新!
编辑:如果你在另一个Linux发行版上遇到这个问题,直接的问题是在python的包搜索路径中找不到meld子目录。因此,假设 meld 正在由 python 版本 NM 运行,您可能会丢失
/usr/lib/pythonN.M/site-packages/meld/
或者 python 存储其“站点包”的地方的 meld 子目录。有时可以通过硬编码 meld 以使用另一个 python 版本来解决这个问题 - 但前提是那版本有一个适当的 meld site-packages 文件夹。否则,您需要重新安装或手动安装 meld,确保子目录已就位。
答案3
@einpoklum 解释的问题的替代解决方案。
meld/conf.py
添加路径的位置,例如
export PYTHONPATH=/usr/lib/pythonN.M/site-packages
该路径可以通过例如找到
locate meld conf.py
export
可以添加到启动文件中,例如.bashrc
(该部分适用于 Unix bash
,我认为PYTHONPATH
也适用于 Windows)。
答案4
我最近更新了 Cygwin 软件包,导致出现“ModuleNotFoundError:没有名为 'meld' 的模块”失败。就我而言,它有助于将 meld 降级到版本 3.16.4。