Fabric: c.put الارتباك حول سلسلة مقابل كائن يشبه الملف في المحلية

تم إنشاؤها على ١٤ مايو ٢٠١٨  ·  6تعليقات  ·  مصدر: fabric/fabric

وفقًا لـ transfer.put () docs ، يجب أن أكون قادرًا على توفير مسار محلي لملف (كسلسلة) ، أو كائن يشبه الملف.

عند استخدام (السلسلة) السابقة ، يمكنني تحديد المسار الهدف فقط في المسار remote . يستخدم هذا في بعض الأمثلة :

c.put('myfiles.tgz', '/opt/mydata')

ولكن عندما أحاول أن أفعل الشيء نفسه ( c.put('file.txt', '/home/me/dir') ، ينتهي بي الأمر دائمًا بـ IOError: Failure ، لأنه في الواقع يتصرف كما لو كان المسار local كائنًا يشبه الملف و لا سلسلة.

فشل على وجه التحديد في paramiko.transport.sftp.sftp._log: [chan 0] open('/home/me/dir', 'wb')

الحل هو دائما توفير المسار الكامل ، على سبيل المثال

c.put('file.txt', '/home/me/dir/file.txt')

لكن هذا يتعارض مع المستندات والأمثلة.

أخيرًا ، الاضطرار إلى توفير المسار الكامل لـ $HOME أقل من المثالي ، ولكن يبدو أن هناك مشكلة لذلك بالفعل # 1653

  • تم اختباره في نظام التشغيل Windows 10
  • قماش 2.0.0
  • Paramiko 2.4.1
  • استدعاء 1.0.0
Bug Wart put()/get()

ال 6 كومينتر

أي تحديثات على هذا؟ Connection.put مع remote كسلسلة مسار الدليل تقوم حاليًا برفع IOError .

(شكرًا أيضًا على كل العمل على Fabric et al!)

النسيج 2.1.3
Paramiko 2.4.1
استدعاء 1.0.0

يبدو وكأنه خطأ شرعي ، سوف نلقي نظرة لاحقًا. التصحيحات (والاختبارات! لأننا نجتاز جميعًا: (مما يعني أننا نفتقد بعضًا ...) مرحبًا بك.

بالنظر إلى هذا الآن ، لست متأكدًا من أن المشكلة تتعلق بافتراض FLO ، أعتقد أنه بدلاً من ذلك مجرد نقص مباشر في تنفيذ المسار البعيد الصحيح - بمعنى آخر ، نطلب من خادم SFTP فتح الدليل كـ ملف للكتابة ، بدلاً من وضع الاسم الأساسي للملف المحلي على مسار الدليل البعيد.

سجل تصحيح الأخطاء الجزئي من طرف Fabric:

invoke.transfer.put: Massaged relative local path 'setup.py' into '/Users/jforcier/Code/oss/fabric/setup.py'
invoke.transfer.put: Uploading '/Users/jforcier/Code/oss/fabric/setup.py' to '/Users/jforcier/tmp/'
paramiko.transport.sftp.sftp._log: [chan 2] open(b'/Users/jforcier/tmp/', 'wb')

ثم يظهر جزء من التتبع الخلفي أننا نلقي بمسار الدليل هذا في CMD_OPEN ، في sftp_client.py :

t, msg = self._request(CMD_OPEN, filename, imode, attrblock)

مما يؤدي في النهاية إلى معالجة خطأ نفس الملف / الفئة حول ما قال خادم SFTP إنه خطأ في عملية الإدخال / الإخراج (وهذا هو السبب في أنه مجرد "فشل" لأنه بالطبع ... AFAIK هو خطأ OpenSSH.)


على أي حال ، حان الوقت لكتابة بعض الاختبارات لإثبات ذلك ثم معرفة ما إذا كان ذلك منطقيًا (اعتقدت أننا _ كنا نبني مسارًا ملحقًا في مرحلة ما) أو وظيفة فعلية مفقودة.

حسنًا ، لا ، كل هذا يحدث حول المسارات البعيدة الفارغة أو النسبية ، ولا يوجد فحص is-directory.

أثناء وجودي هنا ، أتساءل عن كيفية التعامل مع FLOs أيضًا ، في حالة أن يكون المسار البعيد دليلًا.

في الإصدار 1 ، نظرنا إلى السمة .name الخاصة بـ FLOs لأنها

على أي حال ، هنا في الإصدار 2 لدينا الفرصة لمعالجة ذلك بالنسبة للواقع الحقيقي ، أو لمجرد طرح استثناء صريح يقول "مهلاً ، تحتاج إلى إعطاء مسار ملف بعيد غير دليل لهؤلاء". ربما كلاهما ، نظرًا لأنه ليس بالضرورة أن تحتوي جميع FLO على سمة الاسم على أي حال.

حسنًا ، كل هذا تم إصلاحه ، وسيتم طرحه في إصدار إصلاح الأخطاء التالي 🎉

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات