Fabric: c.menempatkan kebingungan tentang string vs objek seperti file di lokal

Dibuat pada 14 Mei 2018  ·  6Komentar  ·  Sumber: fabric/fabric

Menurut transfer.put() docs , saya harus dapat menyediakan jalur lokal ke file (sebagai string), atau objek seperti file.

Saat menggunakan yang pertama (string), saya dapat menentukan di jalur remote hanya direktori target. Ini digunakan dalam beberapa contoh :

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

Tetapi ketika saya mencoba melakukan hal yang sama ( c.put('file.txt', '/home/me/dir') , saya selalu berakhir dengan IOError: Failure , karena itu sebenarnya berperilaku seolah-olah jalur local adalah objek seperti file dan bukan seutas tali.

Gagal secara khusus pada paramiko.transport.sftp.sftp._log: [chan 0] open('/home/me/dir', 'wb')

Solusinya adalah selalu menyediakan path lengkap, mis

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

Tapi itu tidak konsisten dengan dokumen dan contoh.

Akhirnya, harus memberikan path lengkap ke $HOME kurang dari ideal, tetapi tampaknya sudah ada masalah #1653

  • Diuji di Windows 10
  • Kain 2.0.0
  • Paramiko 2.4.1
  • Panggil 1.0.0
Bug Wart put()/get()

Semua 6 komentar

Ada pembaruan tentang ini? Connection.put dengan remote sebagai string jalur direktori saat ini memunculkan IOError .

(Juga terima kasih untuk semua pekerjaan di Fabric et al!)

Kain 2.1.3
Paramiko 2.4.1
Panggil 1.0.0

Kedengarannya seperti bug yang sah, akan kita lihat nanti. Tambalan (dan tes! karena kita semua lulus :( menyiratkan bahwa kita kehilangan beberapa ...) selamat datang.

Melihat ini sekarang, saya tidak benar-benar yakin masalahnya adalah asumsi FLO, saya pikir itu hanya kurangnya penerapan munging jalur jarak jauh yang benar - dengan kata lain, kami meminta server SFTP untuk membuka direktori sebagai file untuk ditulis, alih-alih menempelkan nama dasar file lokal ke jalur direktori jarak jauh.

Log debug parsial dari akhir 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')

Kemudian bagian dari traceback menunjukkan bahwa kita melempar jalur direktori itu ke CMD_OPEN, di sftp_client.py :

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

Yang akhirnya mengenai penanganan kesalahan file/kelas yang sama di sekitar apa yang dikatakan server SFTP salah dengan operasi IO (itulah sebabnya itu hanya "Kegagalan" karena tentu saja ...AFAIK itu kesalahan OpenSSH.)


Bagaimanapun, waktu untuk menulis beberapa tes untuk membuktikan ini dan kemudian mencari tahu apakah itu logika oops (saya pikir kami _were_ membangun jalur yang ditambahkan di beberapa titik) atau fungsionalitas yang benar-benar hilang.

OK, tidak, semua munging ada di sekitar jalur jarak jauh yang kosong atau relatif, tidak ada pemeriksaan direktori-is.

Sementara saya di sini, bertanya-tanya bagaimana menangani FLO juga, dalam kasus di mana jalur jarak jauh adalah direktori.

Di v1, kami melihat atribut .name FLO karena itu

Bagaimanapun, jadi di sini di v2 kami memiliki kesempatan untuk mengatasinya secara nyata, atau untuk hanya melemparkan pengecualian eksplisit yang mengatakan "whoa hey Anda perlu memberikan jalur file jarak jauh non-direktori untuk ini". Mungkin keduanya, karena tidak semua FLO harus memiliki atribut name.

OK, itu semua sudah diperbaiki, akan keluar di rilis perbaikan bug berikutnya

Apakah halaman ini membantu?
0 / 5 - 0 peringkat