0

ラズベリーパイで小さなpython音楽クライアントを構築したいだけです。「mpg321」をインストールしましたが、うまく機能しますが、今は私の問題です。コマンド送信後

os.system("mpg321 -R testPlayer")

python は、再生、一時停止、終了などのユーザー入力を待ちます。これを端末に書き込むと、プレーヤーは音楽を一時停止したり終了したりします。完璧ですが、Pythonにそれをさせたいので、コマンドを送信します

os.system("LOAD test.mp3")

ここで、LOAD はこの mp3 をロードするためのコマンドです。しかし、何も起こりません。ターミナル経由でプレーヤーを終了すると、次のエラーが表示されます。

sh: 1: LOAD: not found

という意味だと思います

os.system("mpg321 -R testPlayer")

プロセス全体を取得し、終了した後、python はコマンド LOAD を実行しようとします。では、これらを連携させるにはどうすればよいでしょうか。

私のコード:

import os

class PyMusic:
    def __init__(self):
        print "initial stuff later"

    def playFile(self, fileName, directory = ""):
        os.system("mpg321 -R testPlayer")
        os.system("LOAD test.mp3")


if __name__ == "__main__":
    pymusic = PyMusic()
    pymusic.playFile("test.mp3")

ご協力いただきありがとうございます!

4

2 に答える 2

5

まず、 を使用することはほとんどないはずos.systemです。subprocessモジュールを参照してください。

を使用する主な利点の 1 つsubprocessは、必要な動作を選択できることです。バックグラウンドで実行し、開始して終了するまで待機し (0 以外の値が返された場合は例外をスローします)、それと対話しstdinstdout明示的に動作します。検出。

ここでは、別のコマンドを実行しようとしているのではなく、"LOAD test.mp3"それを入力として既存のプロセスに渡そうとしています。そう:

p = subprocess.Popen(['mpg321', '-R', 'testPlayer'], stdin=PIPE)

次に、これを行うことができます:

p.stdin.write('LOAD test.mp3\n')

これは、シェルからこれを行うのとほぼ同じです。

echo -e 'LOAD test.mp3\n' | mpg321 -R testPlayer

ただし、コードを で動作させる方法を理解できる場合はいつでも、一般的な I/O を処理するよりもはるかに簡単なので、おそらくcommunicatecommunicateについて読む必要があります (特に、パイプ、ソケット、など)。

または、コマンド ライン UI と対話しようとしている場合 (たとえば、適切なプロンプトが表示されるまでコマンドを送信できない場合)、"expect" ライブラリを参照することをお勧めします。これらの中から選択できるものはいくつかあるので、PyPI で検索して適切なものを見つける必要があります (ただし、私は過去にpexpectをうまく使用したことがあり、ドキュメントにはアイデアを得るサンプルがたくさんあります)ほとんどのexpectドキュメンテーションよりもはるかに高速です)。

于 2012-12-13T20:49:28.017 に答える
2

にデータを送信する方法を探していますstdin。Popen を使用した例を次に示します。

from subprocess import Popen, PIPE, STDOUT

p = Popen(['mpg321', '-R testPlayer'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

mpg123_stdout = p.communicate(input='LOAD test.mp3\n')[0]
print(mpg123_stdout)

stdinおよびへのポインタを確立しstdout、プロセスを開始した後、 と通信してstdinから読み取りますstdout。必ず新しい行 (キャリッジ リターン) を送信してください

于 2012-12-13T20:47:46.443 に答える