簡體   English   中英

在 Python 應用程序中使用 Raspberry Pi 4B 終端命令

[英]Use Raspberry Pi 4B Terminal Command in Python Application

我目前正在開發一個小型 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 到日志文件的重定向。 我感謝在這個問題上的一些指導。 音頻文件的變量文件名已經完成,但為了簡單起見,從這個代碼片段中取出。

謝謝馬克,我根據你的提示深入研究了這個命令行,它只能在 shell=True 下運行,這意味着它必須寫成一個完整的語句,而不用分隔逗號和轉義引號。 現在它起作用了。 實際上, shlex.split() 已經過時了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM