2011-10-29 6 views
0

私のreaddirジェネレータでは、python fuse fsをビルドします。最初のコード行はprint文です。これは私のコンソールに一度も現れなかった。私はバッファリングの問題だと思ったので、stderrへの印刷に変更しました。まだ出力はありません。Pythonでジェネレータのstderrにプリント

手動で次の行にフラッシュを追加しました。まだ何も表示されていません。

私は次の行にtime.sleep(3)を追加しました。本当にprogはスリープします。

def readdir(self, path, offset): 
    print >> sys.stderr, 'Text' 
    sys.stderr.flush() 
    time.sleep(3) 

私はその後、私は出力を得るのですか、私のマウントヒューズディレクトリの内容を参照するには、端末にLSを行うことができ、他のコード(利回りfuse.Direntry) でディレクトリを移入するために行くが、私はしたいですこの1つのジェネレータでprintコマンドが動作しない理由を知る

更新

苦労している人のために

は:

def readdir(self, path, offset): 
    print >> sys.stderr, 'Text' 
    sys.stderr.flush() 
    for o in os.listdir("." + path): 
     yield fuse.Direntry(o) 

コードです。それはファイルリストを生成し、私はそれを移動することができます。それは結構です。 問題は、「テキスト」がSTDOUT、STDERR、どこにも表示されないことです。

私は、なぜこれがこのジェネレータでのみ発生するのかを簡単に尋ねました。私はヒューズコードのどこかに印刷物を置くことができ、非常にうまく出力できます。

+0

@delnan申し訳ありませんが、私はあなたのコメントを理解していません。それがあなたのコメントであるならば、私はコードの下にさらに歩留まりを使うように言います。 – gazhay

+0

@delnan彼のポストをもう一度読んでください。彼は実際に彼が示していないコードに 'yield 'があると言っています。 \t \t印刷>> sys.stderrを持ち、 'テキスト' \t \t sys.stderrを持ち: – agf

+0

これはコードである '\tデフのreaddir(自己、パス、オフセット)(私はそれがこのコメントで動作させることはできません)。フラッシュ()os.listdir中のO(+パス "")のための \t \t: \t \t \t降伏fuse.Direntry(O) ' – gazhay

答えて

1

FUSEコードはFUSEライブラリの制御下で実行されるため、stdin,stdoutおよびstderrが端末セッションのものであることを確認することはできません。 readdirジェネレーターが代替ストリームstd*ストリームで呼び出されている可能性があります。

あなたは何の問題もなく、あなたのFUSEコードprintの他の部分は、あなたが何を理解するために、デバッグログメッセージ(sys.stdout.isatty()の値、あるいはrepr(sys.stdout)は便利かもしれない)で、すべてのprintステートメントを接頭辞にしたいかもしれないと言うので、続行中です。

+0

私は既に何が起きているのかを知ることができるロギングクラスからロガーを実装しました。 – gazhay

関連する問題