如何提高这个python远程服务代码的质量?

时间:2010-11-02 22:34:44

标签: python paramiko

我编写了几个小的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 个答案:

答案 0 :(得分:2)

命令在shell中执行,因此您可以使用常规shell语法将它们组合在一起。作为第一步,我将在一个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 :(得分: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服务器。您可能还想创建一个GenericClient类和一个GenericServer类,您可以从中继承并根据所选的文件系统进行修改。

一般来说,我在python中读了一下Object Orientation。我找到了一个指南here,但可能会有一些其他人可以提出的更好的指南。