Как я могу улучшить качество этого кода удаленного обслуживания Python? - PullRequest
0 голосов
/ 03 ноября 2010

Я написал несколько небольших скриптов Python для запуска кластеров внутри облачных инфраструктур с распределенными файловыми системами.Теперь я интегрировал код в одно приложение командной строки, но качество кода очень плохое.

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

Приложению необходимо отправить много команд через SSH с paramiko.Каждая команда, отправляемая через SSH, требует трех строк кода:

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

Как улучшить качество кода?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Команды выполняются в оболочке, поэтому вы можете использовать обычный синтаксис оболочки, чтобы объединить их вместе.В качестве первого шага я бы выполнил пакет команд в одной команде 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()
1 голос
/ 03 ноября 2010

Первое, что я хотел бы сделать, это улучшить читаемость происходящего, добавив некоторые функции, так как сейчас он представляет собой один большой скрипт с слишком большим количеством уровней отступа и перенаправления, что затрудняет чтение.

Для начала, теперь, когда у вас есть приложение командной строки, вы должны сначала убедиться, что именно так оно и выполняется. Вы также должны сделать выбор файловой системы и все остальное, что нужно выбрать во время выполнения, переключателем командной строки. Если пользователь вводит что-то неправильное, распечатайте использование и выйдите. Может быть, что-то вроде этого:

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 / start. Вы также можете создать класс GenericClient и класс GenericServer, которые вы наследуете и изменяете в зависимости от выбранной файловой системы.

В общем, я бы немного прочитал об объектной ориентации в python. Я нашел одно руководство здесь , но могут быть и лучшие, которые другие могут предложить.

...