سؤال

في كود بايثون الخاص بي، أستخدم وحدة إدخال الملف لاستبدال ما يلي:

import fileinput

for line in fileinput.FileInput("permission.txt",inplace=1):
    line = line.strip()
    if not 'def' in line:
        print line
    else:
        line=line.replace(line,'zzz')
        print line


fileinput.close()

ومع ذلك، بمجرد الانتهاء من ذلك، يتم الآن تغيير أذونات Permission.txt إلى الوصول إلى الجذر فقط.لم يعد بإمكاني تحرير الملف.لا أستطيع إلا حذفه.

لقد أجريت بعض البحث على Google وذكرت أن هذا قد يكون بسبب قيام fileinput بإنشاء ملف مؤقت لتفاعل استبدال القراءة/الكتابة هذا.

ومع ذلك، كنت أعتقد أنه سيكون هناك حل لهذه المشكلة منذ أن تم الإبلاغ عن الخطأ في عام 1999.هل هذا شيء يجب علي فعله في الكود الخاص بي للحفاظ على الأذونات كما هي؟أم أنها مشكلة على مستوى نظام التشغيل.

أنا أستخدم Python 2.6.2 على Ubuntu 9.04

هل كانت مفيدة؟

المحلول

إذا كان بإمكانك مساعدته، فلا تقم بتشغيل البرنامج النصي كجذر.

يحررحسنًا، لقد تم قبول الإجابة، لكنها ليست إجابة كبيرة حقًا.في حالة ضرورة تشغيل البرنامج النصي كجذر (أو في الواقع مثل أي مستخدم آخر)، يمكنك استخدامه os.stat() لتحديد معرف المستخدم ومعرف المجموعة لمالك الملف قبل معالجة الملف، ومن ثم استعادة ملكية الملف بعد المعالجة.

import fileinput
import os

# save original file ownership details
stat = os.stat('permission.txt')
uid, gid = stat[4], stat[5]

for line in fileinput.FileInput("permission.txt",inplace=1):
    line = line.strip()
    if not 'def' in line:
        print line
    else:
        line=line.replace(line,'zzz')
        print line


fileinput.close()

# restore original file ownership
os.chown("permission.txt", uid, gid)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top