0

现在我需要打开一个远程文件来写东西,代码是这样的:

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'

如果我想强制将文件同步写入磁盘,我该怎么办?

4

2 回答 2

1

根据文档:

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

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()

https://docs.python.org/2/library/stdtypes.html#file.fileno)只能从 python 文件流中调用,并且您file.fileno()不会返回与.sftp.open()file.open()

如果我想立即强制将文件写入磁盘,我该怎么办?

如果我没看错的话,我会说你想读,或者读行,然后把它写到一个单独的 python 文件对象中,你可以在你所在的机器上操作它,然后把它写回SFTPFile 要经过适当的操作才能回发到服务器。

于 2015-10-08T04:42:29.660 回答
1

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")
于 2015-10-08T06:19:06.473 回答