2011-08-17 13 views
4

は、私は、このコマンドを使用してランダムな文字列を生成しようとしていることをコマンド文字列の/ dev/urandomコマンドとスパム私の画面とgrep: writing output: Broken pipe取得出力は使用パイプ(パイソン)

これは何が原因で、私はそれを修正しますか?

+0

'実行可能な= '/ bin/bash''を明示的に' call'に追加するとどうなりますか? – agf

+0

まだ同じ問題があります。 – gEr

答えて

5

サブプロセスは必要ない、守っ:

>>> import base64 
>>> r = open("/dev/urandom","r") 
>>> base64.encodestring(r.read(22))[:30] 
'3Ttlx6TT3siM8h+zKm+Q6lH1k+dTcg' 
>>> r.close() 

をまた、/dev/urandomから英数字をINGのstrings ING、その後grepはランダム性の非常非効率的な廃棄物全体の多くです。私のデスクトップPCで、上記のpythonはbashのから実行さ10ミリ秒未満にかかり、あなたのstrings ... onelinerは/dev/urandomないシステム上でも動作する純粋なPythonのソリューションについて300-400 ...

を取る - と英数字のみを提供します(実際に+または/が必要ない場合):

import string 
import random 
''.join([random.choice(string.printable[:62]) for i in range(30)]) 
+0

これは正しい答えです。なぜ車を再発明するのですか? –

+0

よろしくお願いいたします。 – gEr

0

まず、何をしているのか、Pythonを使って文字列を直接生成する方がよいでしょう。とにかく

subprocessを使用して、別のプロセスからのパイプデータに正しい方法はsubprocess.PIPEstdout及び/又はstderrをリダイレクトすることによってであり、そしてstdout前工程とstdin新しいプロセスを養います。

関連する問題