2017-12-24 11 views
0

これは私の最初の質問です。 私は彼が実行したい操作を入力するようにユーザーに依頼するPythonスクリプトを書いています。私は特定の操作(AとN)に2つの機能を持っています。 if-else文を使って特定の関数をチェックして適用し、出力全体を新しいファイルに書き出しました。ファイルハンドルを閉じた後、同じチェックボックスで別の関数を呼び出しています(if-else)。 オンにした場合、他のその出力はに応じて、コマンドプロンプトに表示されなければならない)(約しかし、私は、これは T_N私はこれまで何をやったかPythonでファイルを閉じた後に関数呼び出しエラーが発生しました

obj = PhysioCal() 
if (args.operation == 'N' or args.operation == 'n'): 
    with open (args.output,"w") as fout: 
     sys.stdout=fout 
     t_n=obj.nucleotide(obj.fasta_reader(args.input)) 
     sys.stdout.close() 
    obj.about(t_n) 
elif (args.operation == 'A' or args.operation == 'a'): 
    with open (args.output,"w") as fout: 
     sys.stdout=fout 
     t_a=obj.amino_acid(obj.fasta_reader(args.input)) 
     sys.stdout.close() 
    obj.about(t_a) 
else: 
    obj.about(0) 
    print("\n\t\t\tProcess Failed") 
    print("\t\t\aYou have seleccted wrong operation") 
    print("\t\tuse -h argument for help menu") 
ここ

ある

"Value error: I/O operation on closed file." 

を取得し、 t_aは関数が復帰する時刻です。機能について約 コマンドプロンプトでその時間を表示します。

また、cmdのプリントではなくファイルの関数の出力をすべて取得する方法を書いていますか?

+0

なぜ 'sys.stdout'を上書きしているのですか?' sys.stdout.close() 'は何をしていると思いますか?ヒント: 'open with 'を使っているので、それらを行う必要はありません – DeepSpace

+0

' obj.nucleotide'は暗黙的に標準出力を使用していますか?それ以外の場合は、 'fout'がどのように使われるのかははっきりしません。 – chepner

+0

私の関数は 'print'ステートメントを使います。だから私はそれらのすべての**印刷**ステートメントを書きたいと思ったファイルにリダイレクトする方法を探していた。私は今どこか覚えていないこの方法を見つけた。他の方法を見つけることができませんでした。 @DeepSpace –

答えて

0

あなたはreasigned sys.stdoutfoutですので、プログラムは標準出力に印刷できなくなります。再割り当てなしで直接foutを使用して書き込むことができます。ファイルへの書き込みについては、Pythonのマニュアルを参照してください。

+0

私はOPが様々な 'obj'メソッドへの引数として' fout'を渡す方法を見落としているか、 'sys.stdout'をモックして'代わりにfout'。 – chepner

+0

私たちが想定することができるメソッドの実装についてはわかりません。しかし、OPは、関数について、コマンドプロンプトで時刻を表示すると言っていました。これは 't_a 'の値をstdoutに出力することを前提としています。その時点でstdoutが閉じられているため、エラーがスローされています。 – stormbard

+0

だから私はすべての私の印刷ステートメントをファイルにリダイレクトする方法を変更する必要があると思います。 –

関連する問題