web-dev-qa-db-ja.com

python他のユーザーが書き込める権限を持つファイルをどのように作成しますか

どうすればpython(3)他のユーザーが同様に記述できるファイルを作成します。

os.chmod("/home/pi/test/relaxbank1.txt", 777)
with open("/home/pi/test/relaxbank1.txt", "w") as fh:
    fh.write(p1)  

私が得るもの

--- sr-S--t 1ルートルート12 Apr 20 13:21 relaxbank1.txt

期待される(コマンドラインで$ Sudo chmod 777 relaxbank1.txtを実行した後)

-rwxrwxrwx 1 root root 12 Apr 20 13:21 relaxbank1.txt

13
Richard

問題は、open()への呼び出しが呼び出しを再作成することです。ファイルを閉じた後にchmod()を移動する必要があるか、ORファイルモードを_w+_に変更します。

オプション1:

_with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
    fh.write(p1)
os.chmod("/home/pi/test/relaxbank1.txt", 0o777)
_

オプション2:

_os.chmod("/home/pi/test/relaxbank1.txt", 0o777)
with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
    fh.write(p1)
_

コメント:Option1は、ファイルがまだ存在しない可能性のある状態を処理するため、わずかに優れています(この場合、os.chmod()は例外をスローします)。

15
user590028

os.chmodを使用したくない場合、適切な権限でファイルを作成したい場合は、 os.open を使用して適切なファイルを作成できます記述子、次にopen記述子:

import os
# The default umask is 0o22 which turns off write permission of group and others
os.umask(0)
with open(os.open('filepath', os.O_CREAT | os.O_WRONLY, 0o777), 'w') as fh:
  fh.write(...)

Python 2注:

Python 2.xの組み込み open() は、ファイル記述子によるオープンをサポートしていません。使用 代わりにos.fdopen ;そうでない場合:

TypeError: coercing to Unicode: need string or buffer, int found.
36
AXO

これは堅牢な方法です

#!/usr/bin/env python3
import stat
import os
path = 'outfile.txt'
with open(path, 'w') as fh:
    fh.write('blabla\n')
st = os.stat(path)
os.chmod(path, st.st_mode | stat.S_IWOTH)

方法を見る:

  • stat.S_IWOTHは、生のバイナリ定数の代わりに使用されます。
  • 単一の+oをファイルに追加し、デフォルトでumaskを使用します。以下も参照してください: Python内で?

参照: Pythonで特定の権限でファイルを書き込む