0

分散ファイルシステムを使用してクラウドインフラストラクチャ内でクラスターを起動するために、いくつかの小さなPythonスクリプトを作成しました。今、私はコードを単一のコマンドラインアプリケーションに統合しましたが、コードの品質は非常に悪いです。

http://code.google.com/p/diffuser/source/browse/trunk/diffuser.py

アプリケーションは、paramikoを使用してSSH経由で多くのコマンドを送信する必要があります。SSH経由で送信される各コマンドには、次の3行のコードが必要です。

stdin, stdout, stderr = client.exec_command("<command>")
print stdout.readlines()
print stderr.readlines()

コードの品質を向上させるにはどうすればよいですか?

4

2 に答える 2

2

コマンドはシェルで実行されるため、通常のシェル構文を使用してコマンドを組み合わせることができます。最初のステップとして、単一のexec_commandでコマンドのバッチを発行します。

  stdin, stdout, stderr = client.exec_command(
           "sudo hostname;"
           "sudo apt-get update;"
           "sudo apt-get -y install nfs-common nfs-kernel-server;"
           "echo y | sudo mkfs.ext3 /dev/sdc;"
           "sudo mkdir /mnt/export;"
           "sudo mount /dev/sdc /mnt/export/;"
           "sudo chmod o+wx /etc/exports;")
  print stdout.readlines()
  print stderr.readlines()

また、それぞれに新たなsudoを開始する必要はないと思います。だから私はむしろ書きたい

  stdin, stdout, stderr = client.exec_command(
           "sudo /bin/sh -c '"
           "hostname;"
           "apt-get update;"
           "apt-get -y install nfs-common nfs-kernel-server;"
           "echo y | mkfs.ext3 /dev/sdc;"
           "mkdir /mnt/export;"
           "mount /dev/sdc /mnt/export/;"
           "chmod o+wx /etc/exports;"
           "'")
  print stdout.readlines()
  print stderr.readlines()
于 2010-11-02T23:00:56.477 に答える
1

私が最初にすることは、いくつかの関数を追加することによって、何が起こっているのかを読みやすくすることです。現在のところ、インデントとリダイレクトのレベルが多すぎて読みにくくなっている1つの大きなスクリプトです。

まず、コマンドラインアプリケーションができたので、まずこれが実行方法であることを確認する必要があります。また、ファイルシステムの選択など、実行時に選択する必要のあるものはすべてコマンドラインスイッチにする必要があります。ユーザーが間違ったものを入力した場合は、使用法を印刷して終了します。多分もっとこのようなもの:

if __name__ == '__main__':
    filesystem, other_thing = parse_args(sys.argv)
    config = read_config()
    if filesystem in valid_filesystems and valid_thing(other_thing):
        start_client(config, filesystem)
        start_server(whatever)
    else:
        print_usage()
        sys.exit(0)

次に、最上位の制御フローをstart_client /startserverに追加します。GenericClientクラスとGenericServerクラスを作成することもできます。これらは、選択したファイルシステムに応じて継承および変更します。

一般的に、私はPythonでのオブジェクト指向について少し読みました。ここで1つのガイドを見つけましたが、他の人が提案できるより良いガイドがあるかもしれません。

于 2010-11-03T00:18:49.417 に答える