首页 > 解决方案 > Python playsound 在 IDLE 中有效,但在 Thonny 中出现“no module called gi”错误;Ubuntu终端中的混合结果

问题描述

我试图在 Python 3 中使用 playsound 模块中的 playsound 函数。我从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 适用于 y 但不适用于 z”和“没有名为 xx 的模块”错误。作为一个相对较新的 Python 用户,我正在寻找的是关于如何理解 Python 寻找模块等的不同路径的指导,具体取决于一个人如何执行 Python 代码。

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

  1. 当我在 Thonny(Thonny 版本 2.1.16、Python 版本 3.6.7、Tk 版本 8.6.8)中运行最小代码时,它失败并出现“No module named gi”错误。

  2. 当我在 IDLE(IDLE 版本 3.6.7、Python 版本 3.6.7、Tk 版本 8.6.8)中运行相同的 Python 程序时,它可以正常工作,并且会发出警报声。

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

    $ python3 ./playSiren.py

正确运行并发出声音

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

    $蟒蛇3

Linux 上的 Python 3.6.7(默认,2018 年 10 月 22 日,11:32:17)[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在托尼:

/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/')

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

如果 IDLE 显示 gi 模块/usr/lib/python3/dist-packages/gi/__init__.pysys.path. 为什么它不起作用?

然后我附加了以下内容:

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

现在,不再出现“没有名为'gi'的模块”错误,并且正确播放声音会产生警笛声!

标签: pythonubuntusys.pathpython-playsound

解决方案


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

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

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


推荐阅读