【问题标题】:Use Raspberry Pi 4B Terminal Command in Python Application在 Python 应用程序中使用 Raspberry Pi 4B 终端命令
【发布时间】:2021-05-16 19:30:37
【问题描述】:

我目前正在开发一个小型 Python 应用程序,它将 Raspberry Pi 4B 转换为 48 通道录音机。基本工作,但在录制期间,我需要一个日志文件来告诉我录制开始的时间、发生的 ALSA 警告以及录制停止的时间。

录音机可以用这个终端命令启动:

pi@raspberrypi:~ $ rec -q -t caf --endian little --buffer 96000 -c 48 -b 24 /home/pi/myssd-one/Aufnahmen/test.caf 2>&1 | tee /home/pi/myssd-one/Aufnahmen/logging.log

这会在 test.caf 文件中记录音频并将 ALSA 警告写入 logging.log 到目前为止一切顺利。

Python 程序(应在带有 GUI 的触摸屏上运行,以便轻松开始和停止录制)负责处理可变音频文件名(日期-时间戳)并控制 LED 以显示录制正在运行。

这部分代码负责开启和关闭:

#!/usr/bin/env python

from tkinter import *
import shlex
import os
import subprocess
import tkinter.font
import datetime
from gpiozero import LED
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT)

def ledToggle():
    if led.is_lit:
        led.off()
        my_env = os.environ.copy()
        my_env['AUDIODRIVER'] = 'alsa'
        my_env['AUDIODEV'] = 'hw:KTUSB,0'
        ledButton["text"] = "Turn Recorder on"
        print ("recorder stops")
        subprocess.Popen(['sudo', 'pkill', '-SIGINT', 'rec'],  env = my_env, shell = FALSE, stdout=subprocess.PIPE)
    else:
        led.on()
        my_env = os.environ.copy()
        my_env['AUDIODRIVER'] = 'alsa'
        my_env['AUDIODEV'] = 'hw:KTUSB,0'
        ledButton["text"] = "Turn Recorder off"
        print ("recorder starts")
        ##reference statement command line: "rec -q -t caf --endian little --buffer 96000 -c 48 -b 24 /home/pi/myssd-one/Aufnahmen/test.caf 2>&1 | tee /home/pi/myssd-one/Aufnahmen/logging.log"
        command_line = shlex.split("rec '-q' '-t' 'caf' '--buffer' '96000' '-c 48' '-b 24' '/home/pi/myssd-one/Aufnahmen/test.caf' '"2>&1 | tee"' '/home/pi/myssd-one/Aufnahmen/logging.log'")
        p1 = subprocess.Popen(command_line, env = my_env, shell = False, stdout=subprocess.PIPE)

我正在尝试将原始命令行语句移动到 subprocess.Popen 命令中,但尚未成功。完成路由到日志文件的部分失败。它看起来像启动的 sox 应用程序“rec”试图将其解释为它自己的参数列表的一部分,而不是将其解释为 stdout 和 stderr 到日志文件的重定向。我感谢在这个问题上的一些指导。 音频文件的变量文件名已经完成,但为了简单起见,从这段代码中删除了 sn-p。

【问题讨论】:

  • 如果你想使用 shell 功能,例如重定向,即2>&1,你可以使用shell=True
  • 谢谢马克,我根据你的提示深入了解了这个命令行,它只能与 shell=True 一起运行,这意味着它必须写成一个完整的语句,而不用分隔逗号和转义引号。现在它起作用了。实际上,shlex.split() 已经过时了。
  • 很高兴你让它工作了 - 对不起,我没有在一台机器上为你工作。您可以将其作为答案并接受它...

标签: python command-line raspberry-pi sox


【解决方案1】:

感谢 Mark,我根据您的提示深入研究了这个命令行,它只能在 shell=True 下运行,这意味着它必须写成一个完整的语句,而不用分隔逗号和转义引号。现在它起作用了。实际上,shlex.split() 已经过时了。

【讨论】:

  • 酷 - 请在实际的一两行代码中进行编辑,以便其他人知道实际的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 2021-08-01
  • 2021-10-22
  • 2016-03-24
  • 2018-11-14
  • 1970-01-01
  • 2022-09-28
  • 2016-06-24
相关资源
最近更新 更多