Fabric: c. 在本地将字符串与类文件对象混淆

创建于 2018-05-14  ·  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
  • 参数 2.4.1
  • 调用 1.0.0
Bug Wart put()/get()

所有6条评论

有任何更新吗? Connection.putremote作为目录路径字符串当前引发IOError

(也感谢 Fabric 等人所做的所有工作!)

织物 2.1.3
参数 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')

然后部分回溯显示我们将该目录路径放入sftp_client.py CMD_OPEN 中:

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

最终围绕 SFTP 服务器所说的 IO 操作错误处理相同的文件/类的错误处理(这就是为什么它只是“失败”,因为它当然是......AFAIK 那是 OpenSSH 的错。)


无论如何,是时候编写一些测试来证明这一点,然后弄清楚它是逻辑错误(我认为我们在某个时候_were_ 构建了一个附加路径)还是一个实际的直接缺失的功能。

好的,不,所有的修改都是围绕空的或相对的远程路径进行的,没有 is-directory 检查。

当我在这里时,也想知道在远程路径是目录的情况下如何处理 FLO。

在 v1 中,我们查看了 FLO 的.name属性,因为它是Python FLO API

无论如何,所以在 v2 中,我们有机会解决这个问题,或者只是抛出一个明确的异常,说“哇,你需要为这些提供一个非目录远程文件路径”。 可能两者都有,因为并非所有 FLO 都必须具有 name 属性。

好的,一切都已修复,将在下一个错误修复版本中发布 🎉

此页面是否有帮助?
0 / 5 - 0 等级