7

この質問は、特定のアクセス許可で(Python で) 書き込み用にファイルを開くためのPython で特定のアクセス許可を持つファイルを書き込むへの回答と関係があります。

回答のコードは次のようになります。

with os.fdopen(os.open('foo', os.O_APPEND | os.O_CREAT, 0o644)) as out:
  out.write("hello\n")

2.7.1 のこのコード (私の会社には 2.7.3 がインストールされていません) は以下を生成します:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IOError: File not open for writing

os.fdopen独自のモード引数がありますが、設定は役に立ちません:

>>> with os.fdopen(os.open('foo', os.O_APPEND | os.O_CREAT, 0o644), 'a') as out:
...   out.write("hello\n")
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

簡単に言うと、 および で開かれたファイルに実際に書き込む方法を理解できませんでしos.fdopenos.open。何か案は?2.7.1 の既知のバグ?

前もって感謝します!

4

2 に答える 2

8

open() への「基本」モード引数として、O_RDONLY、O_WRONLY、または O_RDWR のいずれかを選択する必要があります。

明示的にそうしなかったため、O_RDONLY (多くのシステムではゼロ) が想定されます。Pythonos.fdopenは、O_RDONLYO_APPEND が指定されていることを認識しますが、これは少しばかげています。Python は、表示される EINVAL (「無効な引数」) エラーとのこの組み合わせについて不平を言います。

(実際、strace(1)あなたのスクリプトなら — ここでは Linux を想定しています — 「自然な」 EINVAL が発生していないことがわかると思います。代わりに、python はos.open()/を実行open(2)し、直前にファイル記述子のフラグ (F_GETFL) をチェックします)。例外を発生させます。)

于 2012-11-06T19:20:29.693 に答える
1

とてもファンキーです。

os.fdopen(os.open("a1", os.O_CREAT | os.O_RDWR | os.O_APPEND | os.O_EXCL))

働きながら

os.fdopen(os.open("a1", os.O_CREAT | os.O_WRONLY | os.O_APPEND | os.O_EXCL))

を に上げOSError: [Errno 22] Invalid argumentますos.fdopen()

したがって、os.fdopen() には FD への完全な読み取り/書き込みアクセスが必要です。あなたがしない限り

os.fdopen(fd, "w") 

書き込み専用ファイルで動作します。

于 2013-09-03T15:40:09.440 に答える