0

ボックスに(parakimoを使用して)sshしてコマンドを実行するPythonスクリプトを作成しています。stdout/stderr 用のオブジェクトを作成し、出力を出力したかったのです。

  1. リストをクラスに正しく渡していますか? クラスでリストを正しく処理していますか?

  2. メソッドを利用したい__str__ので、単にprint(object)できます。どうすればこれを正しく行うことができますか?

  3. 2 つの別々の sss.exec_command(command) を実行するため、このクラスの 2 つのインスタンスを使用する予定です。この関数をクラスにラップすることでメモリを浪費していますか? OO を利用して効率的で整理し、Python の OO 機能を利用したいと考えていました。
class read_log:
    def __init__(self, exit_status, *tuple_list):
        self.exit_status = exit_status
        self.tuple_list = tuple_list
        if exit_status:
            output = stderr.readlines()
        else:
            output =  stdout.readlines()
            del output[0]
            del output[-1]
    def __str__(self) 
        return ''.join(output)    

def create():
    stdin, stdout, stderr=ssh.exec_command("/home/one/script.sh")
    exit_status = stdout.channel.recv_exit_status()
    x = readlog(exit_status, stdin, stdout, stderr)
    print(x)
4

1 に答える 1

1

stdinstdoutおよびstderr入力を1 つのキャッチオール引数としてキャプチャしますが、関数でそれらの名前を再度参照しようとし__init__ます。

それらを別々のパラメータにするだけです:

class read_log:
    def __init__(self, exit_status, stdin, stdout, stderr):
        self.exit_status = exit_status
        self.tuple_list = (stdin, stdout, stderr)

*args可変数の引数を許可する必要がある場合は、構文を使用します。それ以外の場合は使用しない固定数の引数をキャッチする場合ではありません。とにかく、他の場所で使用している場合に備えて、3 つの引数をタプルとしてインスタンスに保存しself.tuple_listました。

outputインスタンスに保存する必要があります。

if exit_status:
    self.output = stderr.readlines()
else:
    self.output =  stdout.readlines()
    del self.output[0]
    del self.output[-1]

そして__str__そのインスタンス属性を参照してください:

def __str__(self) 
    return ''.join(self.output)

後者のdelステートメントは、スライスに置き換えることもできます。

if exit_status:
    self.output = stderr.readlines()
else:
    self.output =  stdout.readlines()[1:-1]
于 2013-05-17T20:40:32.743 に答える