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 4

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)