В Python, как записать файл на удаленной машине синхронно?

Теперь мне нужно открыть удаленный файл, чтобы написать что-то, код просто так:

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(myHost,myPort,myUser,myPassword)
sftp = client.open_sftp()
fileObject = sftp.open(fullFilePath,'wb')
for i in xrange(10000):
   fileObject.write(databuf)
fileObject.close()    

Теперь я хочу убедиться, что все данные фактически записываются на диск, поэтому код изменяется следующим образом:

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(myHost,myPort,myUser,myPassword)
sftp = client.open_sftp()
fileObject = sftp.open(fullFilePath,'wb')
for i in xrange(10000):
   fileObject.write(databuf)
   fileObject.flush()
   os.fsync(fileObject.fileno())
fileObject.close()    

Но сообщение показывается:

  AttributeError: 'SFTPFile' object has no attribute 'fileno'

Если я хочу синхронно форсировать запись файла на диск, что я могу сделать?

2 ответа

os.fsync() не будет записывать файл на диск на удаленной машине. Модуль os может влиять только на действия локальной машины. Если вы можете выполнить удаленную команду, которая синхронизирует файл на удаленном компьютере, вы можете выполнить ее после "fileObject.flush()". Примерно так (а это прямое копирование и вставка из paramico docs [ http://docs.paramiko.org/en/1.15/api/agent.html][1]):

session = client.get_transport().open_session()
# Forward local agent
AgentRequestHandler(session)
# Commands executed after this point will see the forwarded agent on
# the remote end.
session.exec_command("YOU SYNC COMMAND, TO BE EXECUTED REMOTELY, HERE")

Согласно документации:

http://docs.paramiko.org/en/1.15/api/sftp.html

У SFTPFile нет метода, который вы пытаетесь вызвать. Доступны только следующие методы:

check(hash_algorithm, offset=0, length=0, block_size=0)
chmod(mode)
chown(uid, gid)
close()
flush()
gettimeout()
next()
prefetch()
read(size=None)
readline(size=None)
readlines(sizehint=None)
readv(chunks)
set_pipelined(pipelined=True)
setblocking(blocking)
settimeout(timeout)
stat()
tell()
truncate(size)
utime(times)
write(data)
writelines(sequence)
xreadlines()

file.fileno() ( https://docs.python.org/2/library/stdtypes.html) вызывается только из потоков файлов Python, и ваш sftp.open() не возвращает тот же тип объекта, что и file.open(),

Если я хочу немедленно форсировать запись файла на диск, что я могу сделать?

Если я читаю это правильно, я бы сказал, что вы хотите прочитать или прочитать строки, а затем записать его в отдельный объект файла Python, которым вы будете манипулировать на компьютере, на котором вы работаете, и затем записать его обратно в SFTPFile, чтобы пройти через правильные операции для отправки обратно на сервер.

Другие вопросы по тегам