0

我编写了几个小的 Python 脚本来在具有分布式文件系统的云基础设施中启动集群。现在,我将代码集成到一个命令行应用程序中,但代码质量很差。

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

应用程序需要使用 paramiko 通过 SSH 发送大量命令。通过 SSH 发送的每个命令都需要三行代码:

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

如何提高代码质量?

4

2 回答 2

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()
于 2010-11-02T23:00:56.477 回答
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 中的面向对象的内容。我在这里找到了一个指南,但其他人可能会建议一些更好的指南。

于 2010-11-03T00:18:49.417 回答