Python playsound 在 IDLE 中有效,但在 Thonny 中给出 "no module called gi" 错误; Ubuntu 终端中的混合结果

Python playsound works in IDLE but gives "no module called gi" error in Thonny; mixed result in Ubuntu terminal

我试图使用Python中playsound模块的playsound功能 3.我从http://soundbible.com/1656-House-Fire-Alarm.html获得了一个火警声音的mp3文件进行测试并保存为siren1.mp3。

最小代码:

from playsound import playsound

playsound('siren1.mp3')

最初,我尝试在 Thonny 中 运行 最小的 2 行 Python 代码,但无法让它工作,因为它给出了“No module named gi”错误。

这促使我尝试了各种方法,发现其中一些有效,而另一些则无效。因为我最终设法让 playsound 在 Thonny 中工作,所以我的问题不是如何让 playsound 工作。

在 Stack Overflow 上,我发现许多相关或类似的问题,形式为“x works on y but not on z”和“No module named xx”错误。作为一个相对较新的 Python 用户,我正在寻找的是关于如何理解 Python 根据执行 Python 代码的方式寻找模块等所采用的不同路径的指导。

以下是我所做的实验和我的观察:

  1. 当我运行 Thonny 中的最小代码(Thonny 版本 2.1.16,Python 版本 3.6.7,Tk 版本 8.6.8)时,它失败了“没有名为 gi 的模块”错误。

  2. 相同的 Python 程序在我 运行 IDLE 时正常工作(IDLE 版本 3.6.7,Python 版本 3.6.7,Tk 版本 8.6 .8) 并播放了警笛声。

  3. 在Ubuntu (18.04)终端中,$ which python显示: /usr/bin/python

    $python3./playSiren.py

运行 正确并发出声音

  1. 现在在命令提示符下执行python3

    $python3

Python 3.6.7(默认值,2018 年 10 月 22 日,11:32:17) Linux

上的 [GCC 8.2.0]

现在我复制并粘贴了两个 Python 代码行和 运行 它们 在 Python 提示符下。 代码再次 运行 正确并发出声音。

  1. 我在最小代码中添加了一个 shebang 行并将其更改为可执行文件,然后 运行 它来自 Ubuntu 提示符。

代码再次 运行 正确并发出声音

  1. 当我运行: sudo apt-get install python3-gi,

我收到消息:

python3-gi is already the newest version (3.26.1-2ubuntu1).

空闲:

>>> import gi
>>> gi
<module 'gi' from '/usr/lib/python3/dist-packages/gi/__init__.py'>

sys.path 处于空闲状态:

/home/pi/.local/lib/python3.6/site-packages
/home/pi/Python Learning
/usr/bin
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/lib/python3/dist-packages
/usr/lib/python36.zip
/usr/local/lib/python3.6/dist-packages

在桑尼:

>>> import gi
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
ModuleNotFoundError: No module named 'gi'

sys.path 在 Thonny:

/home/pi/.thonny/Python36/lib/python3.6/site-packages
/home/pi/.thonny/jedi_0.11.1
/home/pi/Python Learning
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/lib/python3/dist-packages/thonny/shared
/usr/lib/python36.zip
  1. 在 Thonny 上,我将以下内容附加到 sys.path
sys.path.append('/usr/lib/python3/dist-packages/gi/__init__.py')
sys.path.append('/usr/lib/python3/dist-packages/gi/')

不过,我在 Thonny 上遇到 No module named 'gi' 错误。

如果 IDLE 显示 gi 模块在 /usr/lib/python3/dist-packages/gi/__init__.py 中,我希望 Thonny 在将其附加到 sys.path 时也能找到 gi。为什么它不起作用?

然后我附加了以下内容:

sys.path.append("/usr/lib/python3/dist-packages")

现在,不再有“No module named 'gi'”错误,并且 正确播放声音产生了警笛声!

我假设您已经从 Thonny 的主页安装了 Thonny+Python 包。在这种情况下,Thonny 使用自己的独立 Python 解释器,它有自己的包。

调整 sys.path 以包含另一个解释器的包,这是不可靠的。它可能适用于 Python-only 包,但如果其他解释器不同(例如 3.6 与 3.7)并且包(部分)在 C 中实现,则它肯定不会工作。

您应该为 Thonny 的 Python 安装所有必需的包("Tools => Manage packages" 会安装它们 per-user,这意味着它们在相同版本的所有解释器之间共享)或者您使 Thonny将您的系统解释器用于 运行 程序(工具 => 选项 => 解释器)。我推荐后者。

来自官方 link,供 ubuntu/debian 用户使用

执行sudo apt install libgirepository1.0-dev gcc libcairo2-dev pkg-config python3-dev gir1.2-gtk-3.0安装构建依赖和GTK

执行pip3 install pycairo to build and install Pycairo

执行pip3 install PyGObject to build and install PyGObject