13

Python 3.2(およびその他のバージョン)では、os.openのドキュメントには次のように記載されています。

この機能は、低レベルのI/Oを対象としています。通常の使用法では、組み込み関数open()を使用します。この関数は、read()メソッドとwrite()メソッド(およびその他多数)を使用してファイルオブジェクトを返します。ファイル記述子をファイルオブジェクトでラップするには、fdopen()を使用します。

そしてfdopen()の場合

ファイル記述子fdに接続されている開いているファイルオブジェクトを返します。これはopen()のエイリアスであり、同じ引数を受け入れます。唯一の違いは、fdopen()の最初の引数は常に整数でなければならないということです。

io.openとの違いに関する質問のこのコメントos.openこの違いは私には完全に明らかです、私は常に使用しますio.open、決してos.open)は尋ねます:なぜ誰かが低レベルのI / OにPythonを選ぶのですか?、しかし実際には答えが得られません。

私の質問はコメントの質問と非常によく似ています。Pythonでは、、、、など介した低レベルのI / Oのユースケースは何ですか?os.openos.fdopenos.closeos.read以前はプロセスをデモ化する必要があると思っていましたが、今はよくわかりません。低レベルのI/Oを使用してのみ実行でき、高レベルのラッパーを使用して実行できないタスクはありますか?

4

2 に答える 2

5

アトミックにファイルを作成するために使用する必要がある場合に使用O_CREAT | O_EXCLしますが、ファイルが存在する場合は失敗します。ファイルの存在を確認してからファイルが存在しないことがテストで判明した場合は、ファイルを作成することはできません。これは、確認から作成までの中間期間にファイルが作成される可能性がある競合状態を作成するためです。

あなたが提供したリンクを簡単に見ると、 pidfileの作成には競合状態があると思います。

Python 3.3では、これを行うように見える新しい'x'モードが追加されopen()ています。しかし、私はそれを試していません。

于 2013-01-11T15:11:44.027 に答える
4

主な違い:

  • ファイルへの低レベルのアクセスはバッファリングされていません
  • 低レベルのアクセスは移植性がありません
  • 低レベルでは、読み取り時にブロックするかどうかなど、よりきめ細かい制御が可能になります

低レベルioのユースケース:

  • ファイルはブロックデバイスです
  • ファイルはソケットです
  • ファイルはttyです
  • ..。

これらすべての場合において、(バッファリングとブロッキングの動作に対して)よりきめ細かい制御が必要になる場合があります。

通常のファイルに低レベルの関数が必要になることはおそらくないでしょう。ほとんどの場合、ユースケースはデバイスドライバーのものになると思います。ただし、これはCで行う方がよいでしょう。しかし、Pythonのユースケースも見ることができます。たとえば、デバイスドライバーの高速プロトタイピングなどです。

于 2013-01-11T15:50:23.517 に答える