3

私はPythonが初めてで、グーグルを試しましたが、助けはありません..
パイプでそのようなコマンドを呼び出す必要があります(最も古い保留中のメールを取得します mailq ):

mailq |grep "^[A-F0-9]" |sort -k5n -k6n |head -n 1

コマンドはシェルで機能します。

Python では、次のように記述しました。

 p = subprocess.Popen( 'mailq |grep \"^[A-F0-9]\" |sort -k5n -k6n |head -n 1', shell=True,
                         stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
 response = p.communicate()[0]

しかし、私はそのような出力を得ます:

並べ替え: 書き込みに失敗しました: 標準出力: 壊れたパイプ\n並べ替え: 書き込みエラー\n

このようなエラーの原因は何ですか?

4

4 に答える 4

2

シェルにコマンドをいくつかのプロセスに分割してパイプ処理させる代わりに、自分でそれを行います。ここで、あるサブプロセス ストリームを別のサブプロセスにパイプする方法を参照してください。

そうすれば、各ステップの出力を調べて (たとえば、stdout を stdout にルーティングしてデバッグするだけで)、ワークフロー全体が問題ないかどうかを確認できます。

次のようになります。

mail_process = subprocess.Popen('mailq', stdin=PIPE, stdout=PIPE, stderr=STDOUT)
grep_process = subprocess.Popen(['grep', '\"^[A-F0-9]"'], stdin=mail_process.stdout, stdout=PIPE, stderr=STDOUT]
...
head_process = subprocess.Popen(["head", ...], ...)
head_process.communicate()[0]
于 2016-12-20T09:05:25.310 に答える
1

ここに書かれているようにサブプロセスを使用することをお勧めします: http://kendriu.com/how-to-use-pipes-in-python-subprocesspopen-objects

ls = subprocess.Popen('ls /etc'.split(), stdout=subprocess.PIPE)
grep = subprocess.Popen('grep ntp'.split(), stdin=ls.stdout, stdout=subprocess.PIPE)
output = grep.communicate()[0]

これは、パイプを使用する pythonic の方法です。

于 2016-12-20T09:05:47.173 に答える