2014-03-31 97 views
0

我试图从python脚本运行OpenStack API。我用subprocess模块​​来做到这一点。在python脚本中运行命令并将结果存储在csv文件或元组中

output = subprocess.check_output('nova-manage vm list',shell=True,) 
print output 

“新星管理的虚拟机列表” 出具有作为“实例,节点,类型,状态,启动,图像,内核,RAMDISK,项目,用户区,索引列的表。

instance node   type  state  launched     image  kernel ramdisk project user  zone  index 
ubuntu12_1 compute1  m1.small active  2014-03-25 07:57:51  946fbcc5-03c3-48a1-9ef9-f6d6362c6152      53963e60e44c4c54b7507e81cf11ef2c f47f5c0a54374a4b8aa78e5349246b0f None  0 
ubuntu12_2 compute1  m1.small active  2014-03-25 07:59:03  946fbcc5-03c3-48a1-9ef9-f6d6362c6152      53963e60e44c4c54b7507e81cf11ef2c f47f5c0a54374a4b8aa78e5349246b0f None  0 
ubuntu12_3 compute2  m1.small active  2014-03-26 07:27:16  946fbcc5-03c3-48a1-9ef9-f6d6362c6152      53963e60e44c4c54b7507e81cf11ef2c f47f5c0a54374a4b8aa78e5349246b0f None  0 
ubuntu12_4 compute2  m1.small active  2014-03-26 07:46:56  946fbcc5-03c3-48a1-9ef9-f6d6362c6152      53963e60e44c4c54b7507e81cf11ef2c f47f5c0a54374a4b8aa78e5349246b0f nova 

以上就是运行“新星管理的虚拟机列表”命令输出的示例例子。

我需要检查只输出的前4列,我应该如何只得到第4列出来的完整的表格?我应该如何将这4列的值存储在csv文件中并访问它?

我是Python脚本编程的初学者,知识很少,所以请在我的问题上提出一些看法。

谢谢,

+0

你能否提供关于输出更多的细节?它看起来怎样?可能还有其他两个选项:直接使用[OpenStack-API绑定](http://www.ibm.com/developerworks/cloud/library/cl-openstack-pythonapis/index.html?ca=drs-) (避免子进程的东西)或使用sed(或其他unix命令行工具)处理“nova-manage”输出 – dorvak

+0

感谢dorvak,您提供的链接非常有帮助。 – Veena

回答

0

第一个选择是直接使用的OpenStack API Python绑定作为@dorvak suggested in the comment

如果你想使用一个子进程,那么你可以使用str.split()nova-managecsv module解析输出到前四列写一个CSV文件:

import csv 
import sys 
from subprocess import Popen, PIPE 

file = sys.stdout # or use with open('output_filename', 'wb') as file: 
p = Popen(['nova-manage', 'vm', 'list'], stdout=PIPE) 
next(p.stdout) # skip header line 
csv.writer(file).writerows(line.split()[:4] for line in p.stdout) 
p.stdout.close() 
p.wait() 
+0

谢谢Sebastian的回答。我觉得使用OpenStack-API绑定非常好,因此将来可以编写与OpenStack相关的其他脚本。 但是,您提供的上述脚本仍然会打印表格的所有列而不是前四个。我应该做什么改变? – Veena

+0

@Veena:代码期望'nova-manage'打印逗号分隔的字段,每行一行。如果不是这样;提供'nova-manage'命令的输出。不要把它放在评论中,[更新你的问题,而不是](http://stackoverflow.com/posts/22765334/edit) – jfs

+0

@维纳:我已经更新了答案,接受由'nova生成的空格分隔输入-manage'。 – jfs

相关问题