IOError: [Errno 2] нет такого файла-Парамико положила()
Я загружаю файл через SFTP, используя Paramiko с sftp.put(localFile, remoteFile)
. Я делаю необходимый каталог первым, если это необходимо с помощью
makeCommand = 'mkdir -p "' + remotePath + '"'
ssh.exec_command(makeCommand)
Это иногда срабатывало, но иногда я получаю следующую ошибку:
sftp.put(localFile, remoteFile)
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 708, in _convert_status
IOError: [Errno 2] No such file
Несмотря на то, что локальный файл определенно существует (и localFile
является правильным путем к нему) и удаленный путь сделан.
Есть обсуждение здесь и здесь по аналогичной проблеме, но ни один из поднятых там вопросов не помог мне. Мой сервер поддерживает команду df -hi
.
Есть ли у кого-нибудь советы по этому или возможному решению?
EDIT
После приведенных ниже предложений я попытался изменить рабочий каталог с помощью sftp.chdir(remoteDirectory)
, но этот вызов привел к той же ошибке, что и выше. Так что, похоже, это не просто проблема загрузки. Есть идеи?
3 ответа:
Похоже, это проблема с разрешением удаленной папки. Хотя удаленная папка была создана до того, как файл был загружен, похоже, что разрешения на папку препятствовали загрузке.
Проблема связана с этой проблемой - если я установлю открытые разрешения на папку, в которую я буду загружать, прежде чем я загружу, программа может загрузить нормально. Хотя для разрешения проблемы я должен получить
IOError: [Errno 13] Permission denied
, так как я внес изменения, я не встретил никаких ошибок.Я-нет. конечно, если это ответ, который сервер дает Paramiko, который является проблемой, или ошибка в самой Paramiko, которая вызывает
IOError: [Errno 2] No such file
вместоErrno 13
, но это, кажется, решило проблему.
IOError
является локальным, поэтому (по какой-то причине) кажется, что ваш локальный python не может найтиlocalFile
. Проверка безопасности перед вызовом может помочь отследить проблему:Если вы уверены, чтоif os.path.isfile(localFile): sftp.put(localFile, remoteFile) else: raise IOError('Could not find localFile %s !!' % localFile)
localFile
существует, то это может быть просто проблема пути-находится лиlocalFile
на абсолютном или относительном пути? В любом случае, приведенное выше утверждениеif
поймает его.EDIT
Трассировка по файлам paramiko показывает, что строка 245 из
sftp_client.py
(The one выбрасывание исключения) на самом делеfr = self.file(remotepath, 'wb')
, что весьма вводит в заблуждение, поскольку парамико бросает
IOError
для удаленного файла! Теперь я думаю, чтоremoteFile
- это либо отсутствующий каталог, либо каталог, к которому у вас нет доступа.Из интереса, можете ли вы перечислить удаленный реж
sftp.listdir(path=os.path.dirname(remoteFile))
Чтобы проверить, что он там (или, может быть, он там, и вы можете написать ему)?
Вы уверены, что каталог был создан и это ваш удаленный рабочий каталог? Paramiko имеет свои собственные методы для создания новых каталогов и навигации по удаленной файловой системе. Рассмотрите возможность использования чего-то вроде:
sftp.mkdir(remotedirectory) sftp.chdir(remotedirectory) sftp.put(localfile, remotefile)