ما هو المستخدم الذي تعمل عليه نصوص بايثون كما هو الحال في النوافذ؟

StackOverflow https://stackoverflow.com/questions/1213706

سؤال

أحاول أن أجعل بايثون يحذف بعض الدلائل وأحصل على أخطاء في الوصول إليها.أعتقد أن حساب مستخدم بايثون ليس لديه حقوق؟

WindowsError: [Error 5] Access is denied: 'path'

هو ما أحصل عليه عندما أقوم بتشغيل البرنامج النصي.
لقد حاولت

shutil.rmtree  
os.remove  
os.rmdir

كلهم يعيدون نفس الخطأ.

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

المحلول

ولقد كان لدينا قضايا ازالة الملفات والدلائل على ويندوز، حتى لو كان لدينا نسخ فقط لهم، إذا كانوا مجموعة 'للقراءة فقط ". shutil.rmtree() يقدم لك نوعا من معالجات استثناء للتعامل مع هذا الوضع. كنت اسميها وتوفير معالج استثناء من هذا القبيل:

import errno, os, stat, shutil

def handleRemoveReadonly(func, path, exc):
  excvalue = exc[1]
  if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
      os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
      func(path)
  else:
      raise

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly)

وقد ترغب في محاولة ذلك.

نصائح أخرى

وأنا لم تستخدم بيثون، ولكن أود أن نفترض أنه يعمل على كل ما المستخدم ينفذ البرنامج النصي.

لا تحتوي البرامج النصية على مستخدم خاص، فهي تعمل فقط ضمن المستخدم الذي قام بتسجيل الدخول حاليًا والذي قام بتنفيذ البرنامج النصي.

هل حاولت التحقق من ذلك:

  • هل تحاول حذف مسار صالح؟وذلك
  • المسار ليس لديه ملفات مقفلة؟

وإذا كان يتم تشغيل البرنامج النصي كمهمة مجدولة (الذي يبدو على الأرجح لالسيناريو تنظيف)، فإنه من المحتمل أن تشغيل كما SYSTEM. انها (غير حكيم، ولكن) من الممكن تعيين أذونات على الدلائل بحيث نظام ليس لديه الوصول.

هل الدلائل فارغة، وإذا لم تفعل تلك الأساليب تدعم حذف decursively محتويات الدليل؟

وكيف حالك تشغيل البرنامج النصي؟ من جلسة عمل وحدة التحكم التفاعلية؟ إذا كان الأمر كذلك، مجرد فتح إطار الأوامر DOS (باستخدام كمد) ونوع 'whoami ". وهذا هو الذي كنت تقوم بتشغيل البرامج النصية بشكل تفاعلي.

وطيب رأيت تعديلاتك فقط الآن ... لماذا لا تقوم بطباعة المسار وتحقق من خصائص لمعرفة ما إذا كان حساب المستخدم تشغيل البرامج النصية لديه الامتيازات المطلوبة؟

إذا whoami لا يعمل على إصدار Windows الخاص بك، يمكنك استخدام متغيرات البيئة مثل SET USERNAME وSET DOMAINNAME من إطار الأوامر الخاصة بك.

وThomasH: لبنة أخرى إلى الحائط

في أنظمة يونكس، لديك للتأكد من أن الدليل الأصل هو قابل للكتابة أيضا. هنا هو نسخة أخرى:

def remove_readonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:

        # ensure parent directory is writeable too
        pardir = os.path.abspath(os.path.join(path, os.path.pardir))
        if not os.access(pardir, os.W_OK):
            os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO)

        os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
        func(path)
    else:
        raise

والحل بسيط بعد البحث لعدة ساعات للتحقق أولا إذا كان هذا الملف موجود فعلا!

GIT_DIR="C:/Users/...."
if os.path.exists(GIT_DIR):
    shutil.rmtree(GIT_DIR)

وهذا لا حيلة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top