47

os.openいつ使うのか、いつ使うのか本当に混乱していますos.fdopen

私はすべての仕事をしos.openていて、それは問題なく機能しましたが、私たちが必要とする条件や他のすべての機能を理解することはできませfile descriptorsdupfsync

とはfile object異なりますfile descriptor

つまりf = os.open("file.txt",w)

ここで、fはファイルオブジェクトまたはそのファイル記述子ですか?

4

1 に答える 1

85

組み込みopen()関数とモジュールos.open()によって提供される関数を混同していosます。それらはまったく異なります。os.open(filename, "w")は有効ではありませんPython(os.open2番目の引数として整数フラグを受け入れます)、open(filename, "w")です。

つまり、open()新しいファイルオブジェクトをos.open()作成し、OSレベルのファイル記述子をos.fdopen()作成し、ファイル記述子からファイルオブジェクトを作成します。

ファイル記述子は、オペレーティングシステムカーネルによって直接提供されるファイルを操作するための低レベルの機能です。ファイル記述子は、プロセスごとにカーネルによって保持される開いているファイルのテーブルで開いているファイルを識別する小さな整数です。多くのシステムコールはファイル記述子を受け入れますが、それらを操作するのは便利ではなく、通常、固定幅のバッファー、特定の条件での複数回の再試行、および手動のエラー処理が必要です。

ファイルオブジェクトは、ファイル記述子をラップするPythonクラスであり、ファイルの操作をより便利にし、エラーが発生しにくくします。たとえば、エラー処理、バッファリング、行ごとの読み取り、文字セット変換を提供し、ガベージコレクション時に閉じられます。

要約すると:

  • ビルトインopen()はファイル名を取り、新しいPythonファイルオブジェクトを返します。これは、ほとんどの場合に必要なものです。

  • os.open()ファイル名を受け取り、新しいファイル記述子を返します。このファイル記述子は、以下で説明するように、 os.read()andなどの他の低レベル関数またはに渡すことができos.write()ます。これが必要になるのは、フラグをos.fdopen()使用するなど、オペレーティングシステムに依存するAPIに依存するコードを作成する場合のみです。O_EXCLopen(2)

  • os.fdopen()既存のファイル記述子を取得します—通常はまたはなどのUnixシステムコールによって生成されpipe()dup()その周りにPythonファイルオブジェクトを構築します。事実上、ファイル記述子を完全なファイルオブジェクトに変換します。これは、Cコードまたは低レベルのファイル記述子のみを作成するAPIとインターフェイスする場合に役立ちます。

ビルトインは、(ファイル記述子を作成するため)と(ファイルオブジェクトでラップするため)openを組み合わせることでエミュレートできます。os.open()os.fdopen()

# functionally equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))
于 2013-02-23T10:49:43.517 に答える