Fabric put命令出现致命错误:'无此文件'异常

17 投票
3 回答
9775 浏览
提问于 2025-04-16 19:34

我正在使用 Fabric 1.01,在我的 fabfile 里使用了 put 命令。代码行是:

put('file.tar.gz', '~/file.tar.gz')

服务器在 env.hosts 列表中。file.tar.gz 和 fabfile 在同一个文件夹里,我也是从这个文件夹运行代码的。

当我运行代码时,它执行到 put 命令的地方。就在失败之前,输出是:

[uname@site.com] put: file.tar.gz -> ~/file.tar.gz

Fatal error: put() encountered an exception while uploading 'file.tar.gz'

Underlying exception message:
    No such file

有人知道这是什么原因吗?这个文件在我的本地机器上肯定是存在的,我也试过把 put() 的第二个参数改成 '/server/path/to/',还试过把第一个 put() 参数改成文件的绝对路径,但都没有用。

3 个回答

0

这个错误的提示确实可以更清楚一些。我原以为是我想上传的文件找不到,但其实是我想上传文件的那个文件夹根本不存在。创建了那个文件夹后,问题就解决了。

20

我觉得这个错误信息有点误导人。打印出来的信息是:

Fatal error: put() encountered an exception while uploading 'local/path'

Underlying exception:
    No such file

这让你觉得问题出在Python没有找到local/path这个文件上。我不确定这种情况是否完全不可能,但在原问题和我遇到的情况中,问题根本和这个无关,真正的问题是找不到远程文件夹。因为这个命令不会自动创建它找不到的路径中的任何文件夹,所以当它找不到远程路径中的任何文件夹时,就会失败。

在我遇到的具体情况中,问题是我提供了一个我希望在远程Linux系统上被解释为绝对路径的路径,但我忘记在开头加上/

11

哎呀,我在处理这个问题的时候有点懒,没把问题匿名处理好。我的代码里用了一个波浪号:

put('file.tar.gz', '~/file.tar.gz')

看起来Fabric在处理这个波浪号的时候,是用我本地电脑的家目录,而不是服务器上的目录。后来我把波浪号换成了服务器上的具体路径,结果就正常工作了。

撰写回答