在Machine1上,我有一个Python2.7脚本,该脚本在RAM中计算一个很大的字符串(最大10MB),我想将其写入到远程机器Machine2上的磁盘文件中。做这个的最好方式是什么?

限制条件:

  • 这两台机器都是Ubuntu 13.04。它们之间的连接速度很快-它们在同一网络上。
  • Machine2上可能尚不存在目标目录,因此可能需要创建它。
  • 如果很简单,我想避免将RAM中的字符串写入Machine1上的临时磁盘文件。这是否消除了可能使用系统调用进行rsync的解决方案?
  • 因为该字符串是二进制的,所以它可能包含可以解释为换行符的字节。这似乎排除了可能使用系统调用Machine2上的echo命令的解决方案。
  • 我希望它在Machine2上尽可能轻巧。因此,我想避免在Machine2上运行诸如ftp之类的服务,或者在该处进行其他配置事件。另外,我不太了解安全性,因此除非确实需要,否则我想避免打开其他端口。
  • 我在Machine1和Machine2上设置了ssh key ,并希望将其用于身份验证。
  • 编辑:Machine1正在运行多个线程,因此有可能多个线程在重叠的时间尝试写入Machine2上的同一文件。在这种情况下,我不介意两次写入文件(或多次写入)会导致效率低下,但是Machine2上生成的数据文件不应因同时写入而损坏。也许需要在Machine2上锁定操作系统?

  • 我支持rsync解决方案,因为它是一个独立的实体,我相当了解,并且不需要在Machine2上进行任何配置。

    最佳答案

    您使用subprocess.Popen打开Machine2的新SSH进程,然后将数据写入其STDIN。

    import subprocess
    
    cmd = ['ssh', 'user@machine2',
           'mkdir -p output/dir; cat - > output/dir/file.dat']
    
    p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    
    your_inmem_data = 'foobarbaz\0' * 1024 * 1024
    
    for chunk_ix in range(0, len(your_inmem_data), 1024):
        chunk = your_inmem_data[chunk_ix:chunk_ix + 1024]
        p.stdin.write(chunk)
    

    我刚刚验证了它的功能与广告一样,并复制了所有10485760虚拟字节。

    P.S. 一个潜在的更清洁/更优雅的解决方案是让Python程序将其输出写入sys.stdout,并在外部进行管道传输到ssh:
    $ python process.py | ssh <the same ssh command>
    

    关于python - 在Python中,如何将字符串写入远程计算机上的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19202314/

    10-12 16:06