وفقًا لـ 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
أي تحديثات على هذا؟ 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 على سمة الاسم على أي حال.
حسنًا ، كل هذا تم إصلاحه ، وسيتم طرحه في إصدار إصلاح الأخطاء التالي 🎉