amixer:无效命令

amixer: invalid command

我正在尝试使用这个小代码片段更改我的 RaspberryPi 的音量:

import os

def setVolume(vol,prefix):
    cmd = "amixer -q -M set PCM " + vol + "%"
    print(prefix+"Changing volume to " + vol + "%")
    print(prefix+str(os.system(cmd)))

我在两个不同的 python 脚本中使用这个函数,但它只在其中一个脚本中有效。 (此功能仅供测试,请忽略前缀和内容)。 它仅适用于其中一个,并给出错误消息: amixer:无效命令! (Python 2.7.13)

这应该很容易让你缩小范围,因为这个问题最终与Python关系不大。您的 python 代码只是构造一个命令字符串,然后由操作系统执行。

首先,我建议您打印或记录您正在执行的完整命令,以便您知道您正在进行的系统调用。您的问题很可能与您 运行 您的命令时有效的当前工作目录有关。所以我会在调用您的实际 cmd 之前调用 os.system("pwd")。这将向您显示在您的命令为 运行 时当前的工作目录。那么这是我建议您 运行 解决问题的代码的修改版本:

def setVolume(vol,prefix):
    cmd = "amixer -q -M set PCM " + vol + "%"
    print(prefix+"Changing volume to " + vol + "%")
    os.system("cmd")
    print("Executing command: >" + cmd + "<")
    print(prefix+str(os.system(cmd)))

在其中放置“>”和“<”将确保您在命令中看到任何空格。通常,这样做会告诉您问题所在,因为您会注意到构建命令的方式存在问题。在您的情况下,vol 参数将是此处有趣的因素。

一旦您获得了要传递给 os.system() 的确切命令,请尝试通过 copy/paste 在 shell 提示符下 运行 执行该命令。理想情况下,您可以在与 运行 您的 Python 脚本相同的 shell 提示符下执行此操作。 "cd" 到您的代码指示的目录中,在您尝试 运行 命令之前进行 "pwd" 调用。这应该将问题与 Python 隔离开来。希望您会看到匹配的 pass/fail 行为,并且您可以在系统命令级别而不是在您的代码中进行故障排除。只有当您完全了解系统调用的工作原理以及它的外观时,您才会 return 到 Python.

如果这不能让你达到目标,我建议使用 subprocess 模块而不是 os.system(),假设它在你的 RasPi 版本的 Python 上可用。我听说过去只需从 os.system() 切换就可以解决问题,尽管我不知道细节。