2010-11-02 6 views
0

Я написал несколько небольших скриптов Python для запуска кластеров внутри облачных инфраструктур с распределенными файловыми системами. Теперь я интегрировал код в одно приложение командной строки, но качество кода очень плохое.Как я могу улучшить качество этого кода удаленной службы 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() 

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

+1

Для начала вы можете узнать, как определить свои собственные функции. Это укажет вам на общее направление, необходимое для устранения большого количества дублирования. См. Http://docs.python.org/tutorial/controlflow.html#defining-functions. – FMc

ответ

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() 
+0

Это выглядит намного лучше. Но как я могу вставить такие детали? '" sudo echo '"+ reservation.instances [0] .public_dns_name +":/mnt/export/mnt/export nfs auto, rw, bg 0 0' >>/etc/fstab "' Проблема здесь - это цитаты ' 'мы используем уже ранее в' 'sudo/bin/sh -c '" ' – Neverland

+0

Используйте замену% s (или .format()). exec_command ("...% s ...", reserve.instances [0] .public_dns_name) –

+0

Я неправильно понял. Для эха я думаю, что использование двойных кавычек (опять же) должно сделать трюк. –

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

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

Смежные вопросы