2011-10-07 18 views
38

別の科学的プログラムを実行するために使用されるos.system()を呼び出すPythonスクリプトを含む科学的ソフトウェアを使用しています。サブプロセスが実行されている間、いくつかの点でPythonは次のように出力されますos.system()中に "IOError:[Errno 9] Bad file descriptor"につながることはありますか?

close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

私はこのメッセージがos.system()リターンと同時に印刷されていることを信じています。

私の質問は次のようになります。

どの条件はIOErrorのこのタイプにつながることができますか?それはどういう意味ですか? os.system()によって呼び出されたサブプロセスはどういう意味ですか?

+2

注: 'subprocess'モジュールを使用して[望ましい](HTTP:/ /docs.python.org/library/os.html#os.system)を 'os.system()'で実行します。 –

+0

:-)私はそれを知っていて、このソフトウェアには完璧ではないものがたくさんあります。 –

答えて

35

Pythonのファイルがすなわちないファイルオブジェクトのclose()方法から、「外」から閉鎖された場合は、このエラーメッセージが表示されます。

>>> f = open(".bashrc") 
>>> os.close(f.fileno()) 
>>> del f 
close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

ラインdel fを引き起こし、ファイルオブジェクトへの最後の参照を削除しますそのデストラクタfile.__del__が呼び出されます。ファイルオブジェクトの内部状態は、f.close()が呼び出されていないので、ファイルがまだ開いていることを示しているので、デストラクタはファイルを閉じようとします。 OSはオープンされていないファイルをクローズしようとしたためにエラーをスローします。

os.system()の実装では、Pythonファイルオブジェクトが作成されないため、system()呼び出しがエラーの原因であるとは思われません。たぶん、もう少しコードを表示できますか?

+0

ありがとう..私はすでにこの疑いがありました。このPythonスクリプトはかなり大きく、よく構造化されておらず、よく書かれていないので、より多くのコードを表示することは現時点では意味がありません。私は今までのところとても良い概観を持っていません。あなたの情報の助けを借りて、まず自分自身で問題を見つけようとします。 –

+0

もう1つの質問:あなたの例では、 'f.close()'の代わりに 'del f'を使いました。これはトレースバックを引き起こしました。 'del f'はPythonのガベージコレクション中に何が起こるかと同じですか? –

+0

私が最初に推測したのは、MPIの並列化を利用するスクリプトとは何か関係があります。つまり、異なるプロセス間でファイル記述子を共有しています。 –

10

ファイルを開くときに間違ったモードを使用すると、このエラーが発生する可能性があります。例えば:

with open(output, 'wb') as output_file: 
     print output_file.read() 

そのコードは、私はファイルを読みたいが、私はモードwb代わりにrまたは使用r+

関連する問題