بيثون شوتيل.فشل نسخ على أنظمة الملفات الدهون (أوبونتو)

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

سؤال

المشكلة:باستخدام شوتيل.نسخ () لنسخ ملف إلى فات 16 شنت نظام الملفات في لينكس فشل (بيثون 2.7.س).الفشل هو خطأ داخلي شوتيل وفشل في الواقع على شوتيل.شمود, الذي شوتيل.يبدو نسخة لتنفيذ.

فشل شل شمود ، أيضا ، كما لا يتم اعتماد الأذونات في الدهون.

أسئلة:هل هناك أي طريقة نظيفة حول هذا?أعلم أن لدي عدة خيارات ، على سبيل المثال:

  1. استخدام كوبيفيل - ليست مثالية لأنها تتطلب المسار الكامل ، وليس فقط الدليل الهدف ، ولكن قابلة للتنفيذ
  2. تنفيذ شل كب لنسخ الملفات
  3. اكتب وظيفة النسخ الخاصة التي لا تحاول تغيير أوضاع الملفات

هل هناك طريقة للتغلب على هذا في بايثون أو في خيارات جبل الدهون?أنا الآن جبل نظام الملفات داخل برنامجي عن طريق تنفيذ جبل-تي ففات-أوماسك=000 / ديف / لوب0 /منت / فو

اصطياد الاستثناء لا يساعد ، كما يحدث الاستثناء داخل شوتيل.نسخ وشوتيل.نسخ () يبدو لحذف الملف الهدف عندما يمسك إوكسيبتيون من شوتيل.شمود () ، قبل تمرير إوكسيبتيون إلى وظيفة الاستدعاء.

أي أفكار, أو يجب أن مجرد اختيار واحد من 1-3?

هانو

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

المحلول

حسنا أنا الغش في هذه الحالة.

إذا كنت أعرف أن الهدف هو نظام الملفات حيث chmod فشل ، أنا ببساطة حذف chmod طريقة من حزمة نظام التشغيل باستخدام del os.chmod, ، وهذا يسمح للنسخة بالنجاح.

>>> import os
>>> print hasattr(os, 'chmod')
True
>>> foo = os.chmod
>>> del os.chmod
>>> print hasattr(os, 'chmod')
False

هذا الآن يسمح لك لأداء النسخة دون الفشل على شمود.ثم نعيد تمكينه عن طريق تعيين السمة مرة أخرى.

>>> setattr(os, 'chmod', foo)
>>> print hasattr(os, 'chmod')
True

نصائح أخرى

استخدام shutil.copyfile, ، لا يتطلب المسار الكامل.

حذف os.chmod عالميا لا فكرة جيدة.

$ mkdir folder
$ touch folder/a
$ python2.7 -c 'import shutil; shutil.copyfile("folder/a","folder/b")'
$ ls -rthla folder/
total 0
drwxr-xr-x+ Apr 17 12:49 ../
-rw-r--r--  Apr 17 12:49 a
-rw-r--r--  Apr 17 12:50 b
drwxr-xr-x+ Apr 17 12:50 ./

كما ترون في شفرة المصدر بيثون من شوتيل (/usr/lib/python2.7/shutil.py) ، لا يوجد اعتبار للمسار (نسبي / مطلق) في copy شفرة المصدر ، و src يتم تمرير المتغير مباشرة كحجة من copyfile.

def copy(src, dst):
    """Copy data and mode bits ("cp src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copymode(src, dst)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top