3

次のようにスレーブモードで実行しているときに、パイプ経由で mplayer にコマンドを送信しようとしています:

import subprocess, time
# start mplayer
song = 'mysong.mp3'
cmd = ['mplayer', '-slave', '-quiet', song]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)

# send a command every 3 seconds.
# Full command reference here: http://www.mplayerhq.hu/DOCS/tech/slave.txt 
while True:
    print('sleep 3 seconds ...')
    time.sleep(3)
    cmd = 'get_meta_artist'
    print('send command: {}'.format(cmd))
    p.stdin.write(cmd)
    output = p.communicate()[0]
    print(output)

しかし、アウトプットは何もありませんでした。

この質問から例を挙げました。

ターミナルで同じ mplayer コマンドを実行すると、正常に動作します。ここで何が欠けていますか?

アップデート:

cmd を「get_meta_artist」から「get_meta_artist\n」に変更して、パイプにも改行が送信されるようにしましたが、出力には何も表示されませんでした。

更新 2:

コマンドを「\npause\n」に変更すると、音楽が一時停止しました。つまり、標準入力を介してコマンドを送信することは機能しました。これは、「\nget_meta_artist\n」コマンドの出力文字列が期待どおりにパイプされなかったことを意味します....

4

2 に答える 2

1

私は今このようにしており、出力を取得し始めています:

 while True:
    cmd = '\nget_meta_artist\n'
    p.stdin.write(cmd)
    output = p.stdout.readline()
    print("output: {}".format(output.rstrip()))
    sys.stdout.flush()

mplayer 自身の初期化 stdout の最初のフラッシュをバイパスする方法を見つける必要はまだありますが、問題は解決したと考えています。

役に立つヒントを教えてくれた glglgl に感謝します。

于 2013-04-07T02:47:47.850 に答える