gpt4 book ai didi

python - 在 python 中创建一个可重用的类

转载 作者:行者123 更新时间:2023-11-28 16:49:29 25 4
gpt4 key购买 nike

我需要透明地处理远程文件,就好像它们是我正在编写的某些 python 代码中的本地文件一样,所以我决定使用 SFTP 来完成这项任务。以下代码示例有效(它打印远程文件的第一行):

import paramiko

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.8.103', username='root', password='pyjamas')
sftp = client.open_sftp()
test = sftp.open('/var/log/example/ingest.log', mode='r', bufsize=1)
print test.readline()

我将要连接到许多文件,所以我决定编写一个类,为我提供一个 SFTPFile 对象。检查以下代码:

import paramiko

class RemoteLog(object):
"""This class implements the remote log buffer."""

def __init__(self, host, user='', pw='', log=''):
"""Initializes a connection to a remote log."""

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=pw)
sftp = client.open_sftp()
self.log = sftp.open(log, mode='r', bufsize=1)

if __name__ == "__main__":
test = RemoteLog(host='192.168.8.103', user='root', pw='pyjamas', log='/var/log/example/ingest.log')
print test.log.readline()

不幸的是,在这种情况下 readline() 什么都不返回。没有错误或明显的解释。

我应该如何将第一个代码片段中的功能复制到可重用类中?

最佳答案

当变量超出 __init__ 的范围时,sftp 连接似乎已关闭。存储对类中那些对象的引用可以解决问题。

def __init__(self, host, user='', pw='', log=''):
"""Initializes a connection to a remote log."""

self.client = paramiko.SSHClient()
self.client.load_system_host_keys()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.client.connect(hostname=host, username=user, password=pw)
self.sftp = self.client.open_sftp()
self.log = self.sftp.open(log, mode='r', bufsize=1)

作为额外的建议,您可以考虑实现标准文件对象函数并将 self.log 引用隐藏在您的对象后面。而不是 test.log.readline(),你真的应该能够使用 test.readline() 因为你正在尝试包装一个类似文件的对象(你应该也确实实现了一个 close() 方法)。这样做需要做一些工作,但这是一次性的工作,将使使用此类的代码更加清晰。

关于python - 在 python 中创建一个可重用的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com