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

ファイルをすぐに強制的にディスクに書き込みたい場合、どうすればよいですか?

私がこれを正しく読んでいるなら、私はあなたが読みたい、またはreadlinesし、それをあなたが使っているマシン上で操作する別のpythonファイルオブジェクトに書き込んでから、 SFTPFile を使用して適切な操作を実行し、サーバーにポスト バックします。

于 2015-10-08T04:42:29.660 に答える
1

os.fsync() は、ファイルをリモート マシンのディスクに書き込みませんでした。os モジュールは、ローカル マシンが行うことのみに影響を与えることができます。リモート マシン上のファイルを同期するリモート コマンドを発行できる場合は、「fileObject.flush()」の後に発行できます。このようなもの (これは、paramico ドキュメント [ 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 に答える