簡體   English   中英

Python、mpg123 和子進程未正確使用 stdin.write 或通信

[英]Python, mpg123 and subprocess not properly using stdin.write or communicate

好的,所以我的 google-fu 真的很糟糕,我找不到答案,希望你們能幫助我 ^_^

好的,所以我認為一個簡單的腳本似乎沒有與其子進程正確通信,我正在逐行運行此腳本。 我也在使用 mpg123 播放器,這是一個 Linux 系統(嗯,樹莓派)

    from subprocess import Popen, PIPE, STDOUT
    p = Popen(["mpg123", "-C", "test.mp3"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    #wait a few seconds to enter this, "q" without a newline is how the controls for the player work to quit out if it were ran like "mpg123 -C test.mp3" on the command line
    p.communicate(input='q')[0]

我可以在它上面運行 stdout.read() 就好了,但是使用通信進行輸入只會讓它掛起,而 p.stdin.write('q') 似乎什么也沒做。 這是與 python 相關的,盡管我有一種感覺,我也沒有在 mpg123 文檔中找到正確的位置。 請善待,因為我對此非常陌生^_^

檢查您的mpg123版本理解哪些參數。 以下在我的機器上工作:

#!/usr/bin/env python3
import time
from subprocess import Popen, PIPE, DEVNULL, STDOUT

p = Popen(["mpg123", "-K", "test.mp3"], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)

# wait a little
time.sleep(3)

# send command "Skip song", wait for the player to exit
p.communicate(b'n')[0]

它開始播放文件,等待約 3 秒,然后退出。

這是一個糟糕的解決方案,但它在緊要關頭工作。 我將它用作補丁是因為出於某種原因,我無法讓 Python 庫在我的 Raspberry Pi 上正常運行。

如果以遠程模式 ( mpg123 -R ) 啟動mpg123 ,則可以更輕松地向其發送命令:

proc = sp.Popen(["mpg123", "-R"], stdin=sp.PIPE)

然后,您可以向其stdin屬性發送命令。

筆記:

  • 命令是不同的。 例如,暫停是"pause" ,而不是" " 在控制台中運行mpg123 -R ,然后向它發送help命令以查看命令列表。
  • 命令需要以換行符終止。

從文檔:

-R, --remote

激活通用控制界面。 mpg123 然后將從標准輸入讀取和執行命令。 基本用法是 ''load'' 播放一些文件和明顯的 ''pause'', ''command。 ''jump'' 將跳轉/尋找給定點(MPEG 幀號)。 發出“幫助”以獲取完整的命令和語法列表。

暫無
暫無

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

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