Python 在 IDLE 中播放声音,但在 Thonny 中给出 "no module called gi"错误; Ubuntu 终端中的混合结果

标签 python ubuntu sys.path python-playsound

我试图使用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)时,它失败并出现“没有名为 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

运行正确并发出声音

  • 现在在命令提示符下执行 python3

    $ python3

  • Python 3.6.7(默认,2018 年 10 月 22 日,11:32:17) Linux 上的 [GCC 8.2.0]

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

  • 我在最小代码中添加了一个 shebang 行,并将其更改为可执行文件,然后从 Ubuntu 提示符下运行它。
  • 代码再次正确运行并产生声音

  • 当我运行时: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'>
    
    IDLE 中的

    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'
    
    Thonny 中的

    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
    
  • 在 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 也能够找到 gi sys.path。为什么没有成功?

    然后我附加了以下内容:

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

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

    最佳答案

    我假设您已经从 Thonny 的主页安装了 Thonny+Python bundle 。在本例中,Thonny 使用自己独立的 Python 解释器,该解释器有自己的包。

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

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

    关于Python 在 IDLE 中播放声音,但在 Thonny 中给出 "no module called gi"错误; Ubuntu 终端中的混合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56268043/

    相关文章:

    java - 在 ubuntu 中安装 eclipse(eclipse-jee-helios-linux-gtk-x86_64) 时出错

    python-2.7 - python2.7正常调用和subprocess调用时sys.path的区别

    javascript - 使用 Python Flask_socketio react socket.io-client 不处理事件

    python - 从字符串中删除反斜杠

    python - 如何自动检测列是否为分类列?

    google-chrome - Google Chrome 在 ubuntu 上显示 "your connection to this site is not secure",可以安全使用吗?

    Python svgwrite 模块背景色

    bash - 启动脚本以启动分离的屏幕并在其中运行 bash 脚本

    python - 为什么带有尾随冒号的 PYTHONPATH 将当前目录添加到 sys.path?

    python : how to import packages?