如何提高这个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()
我该如何提高代码质量呢?
2 个回答
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)
然后再添加你的顶层控制流程,比如启动客户端或服务器。你可能还想创建一个通用客户端类和一个通用服务器类,然后根据选择的文件系统进行继承和修改。
总的来说,我建议你多了解一下Python中的面向对象编程。我找到了一份指南,在这里,不过可能还有其他更好的推荐。
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()