Подтвердить что ты не робот

Команда putting Fabric дает фатальную ошибку: исключение "Нет такого файла"

Я использую Fabric 1.01, и в моем fabfile я использую команду put. Линия:

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

Сервер находится в списке env.hosts. file.tar.gz находится в том же каталоге, что и файл fabfile, и я запускаю код из этого каталога.

Когда я запускаю код, он доходит до того момента, когда он запускает эту команду put. Перед сбоем выход:

[[email protected]] 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() аргумент, все безрезультатно.

4b9b3361

Ответ 1

Упс, я ленился, когда анонимировал вопрос. Мой код содержал тильду:

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

По-видимому, Fabric сделала интерполяцию тильды, используя домашний каталог моей локальной машины, а не сервер. После замены тильды на явный путь на сервере он отлично работает.

Ответ 2

Я нашел это сообщение об ошибке довольно ошибочным. Печатное сообщение:

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

Underlying exception:
    No such file

Что заставляет вас думать, что проблема в том, что каким-то образом Python не видит файл в local/path. Я не уверен, что это никогда не бывает, но как в случае исходного вопроса, так и в моем случае проблема не имеет к этому никакого отношения, и вместо этого проблема заключалась в том, что удаленная папка не могла быть найдено. Поскольку эта команда не будет автоматически создавать какие-либо папки в пути, который она не находит, она терпит неудачу, если она не может найти ни одну из удаленных папок на удаленном пути.

В моем конкретном случае проблема заключалась в том, что я предоставил путь, который я намеревался интерпретировать как абсолютный в удаленной системе Linux, но я остановился на первоначальном /.