Python 没有文件的类文件操作?

Python 没有文件的类文件操作?,python,Python,我正在开发一个自动化工具,它可以将一系列命令复制到远程系统上的一个文件中,然后通过ssh复制到远程系统并执行该文件。我正在看paramiko的文档,它具有我需要的sftp和ssh命令功能 但是,我注意到paramiko.SFTPClient.put()方法将本地和远程路径的名称作为参数。我希望不必首先在本地写入文件,并找到一种方法让SFTPClient.put接收类似文件的对象,而不是指向实际文件 在python中,有没有一种方法可以做到这一点:将对象引用而不是文件路径传递给SFTPClient

我正在开发一个自动化工具,它可以将一系列命令复制到远程系统上的一个文件中,然后通过ssh复制到远程系统并执行该文件。我正在看paramiko的文档,它具有我需要的sftp和ssh命令功能

但是,我注意到paramiko.SFTPClient.put()方法将本地和远程路径的名称作为参数。我希望不必首先在本地写入文件,并找到一种方法让SFTPClient.put接收类似文件的对象,而不是指向实际文件


在python中,有没有一种方法可以做到这一点:将对象引用而不是文件路径传递给SFTPClient.put(),或者如果SFTPClient.put()无法处理任何非实际文件的内容,则通过命名管道传递给SFTPClient.put()。

我相信您正在寻找的是。

只需将文件写入即可:

from __future__ import with_statement    
import contextlib

with contextlib.closing(sftpClient.open('file.name', 'w')) as f:
   f.write('myData')
只需输入文件并写入:

from __future__ import with_statement    
import contextlib

with contextlib.closing(sftpClient.open('file.name', 'w')) as f:
   f.write('myData')

我不熟悉paramiko,但您可以使用tempfile模块创建临时文件

from tempfile import mkstemp
from os import remove, fdopen
from os.path import exists

file, path = mkstemp()
file = fdopen(file)
# do stuff with paramiko

file.close()
if exists(path):
    remove(path)  # delete the file

编辑:更正代码,使其使用tempfile模块的未弃用且更安全的功能。

我不熟悉paramiko,但您可以使用tempfile模块创建临时文件

from tempfile import mkstemp
from os import remove, fdopen
from os.path import exists

file, path = mkstemp()
file = fdopen(file)
# do stuff with paramiko

file.close()
if exists(path):
    remove(path)  # delete the file

编辑:更正代码,使其使用tempfile模块的未弃用且更安全的功能。

您可以使用Fabric,而不是自己实现它: Fabric有一系列有用的API调用来在远程机器上执行命令

如果你确实倾向于手工操作,那么使用。 SFTP是文件协议,所以事先准备并发送文件是有意义的


如果您确实不想准备文件,请使用以下命令:

而不是自己实现它,您可以使用Fabric: Fabric有一系列有用的API调用来在远程机器上执行命令

如果你确实倾向于手工操作,那么使用。 SFTP是文件协议,所以事先准备并发送文件是有意义的



如果您确实不想准备文件,请使用以下命令:

不,不是
StringIO
创建了一个类似文件的对象,你也不能把它放到
put
中。嗯,我明白了。不过,菲哈格的解决方案似乎是直截了当的。不,不是
StringIO
创建了一个类似文件的对象,你也不能把它放到
put
中。嗯,我明白了。然而,phihag的解决方案似乎是直截了当的。
mktemp
是不安全的,因此被弃用。最主要的原因是不使用它。谢谢你的信息。我真的没见过。我更正了代码段。错过了最后一行。现在更好?
mktemp
不安全,因此不推荐使用。最主要的原因是不使用它。谢谢你的信息。我真的没见过。我更正了代码段。错过了最后一行。现在更好?或者更好的办法是使用paramiko.SSHClient.exec_命令('echo$list_of_commands>/tmp/remote file&&sh/tmp/remotefile')?如果$list_of_命令包含EOL字符,这会中断吗?或者更好的方法是使用paramiko.SSHClient.exec_命令('echo$list_of_命令>/tmp/remote file&&sh/tmp/remotefile')?如果$list\u of\u命令包含EOL字符,此操作会中断吗?您应该在那里使用
with
表达式。@Voo添加了
with
。它在技术上更好,但是
contextlib。关闭
对于类似文件的对象来说有点难看。当然它不是完美的,但是仍然比你需要的try{}finally{}方法更好。你真的应该使用
with
表达式。@Voo添加了
with
。它在技术上更好,但是
contextlib.closing
对于类似文件的对象来说有点难看。当然它不是完美的,但是仍然比您需要的try{}finally{}方法更好。