2017-07-26 60 views
0

我有一个连接到多个计算节点的bash脚本,并根据调用bash脚本后输入的一些参数从每个脚本中提取数据。为了简便起见,我基本上是这样:将bash脚本输出的多个文件导入Python列表

for h in node{0..7}; do ssh $h 'fold -w 80 /program.headers | grep "RA" 
| head -600 | tr -d "RA =" > '$h'filename'; done 

我试图采取8个文件说出来的这个(各有600条信息),并各自保存为一个Python列表。然后我需要在Python中操作它们(分割并转换为浮点数),以便能够使用Matplotlib绘制数据。

对于bash脚本,只输出一个文件,我可以很容易使一个变量名等于check_output然后操纵从那里:

test = subprocess.check_output("./bashscript") 
test_list = test.split() 
test = [float(a) for a in test_list] 

我也能够从我的bash脚本读取保存的文件通过使用:

test = subprocess.check_output(['cat', '/path/filename']) 
test_list = test.split() 
test = [float(a) for a in test_list] 

问题是,我正在处理超过80个文件后,我得到所有我需要的。 Python中是否有某种方式可以说:“每个文件都将商店的内容作为列表进行存储”?

+0

难道你不能一次获得文件并将它们存储在本地文件夹中;那么在它们在本地存在之后,使用Python对它们进行迭代?或者它们是动态创建的还是随着时间的推移而变化,这将需要一遍又一遍地重读它们? – ImportanceOfBeingErnest

回答

0

您可以使用os.popen()来执行脚本,而不是使用子进程捕获数据。使用它的好处是,您可以在读取文件时读取命令/脚本的输出。所以你可以根据你的意愿使用read(), readlines(),readline(),这些都会给你一个清单。通过使用可以执行该脚本,并捕获这样

import os 
output=os.popen("./bashscript").readlines() #now output has the op of bashsceipt with each line as a seperate item as list. 

check this输出有关如何使用os.popen)更多(。 check this要知道read(),readlines(),readline(),xreadlines()之间的差异

+0

这不能解决原始问题:分解不同的机器输出。它只提供了一种更方便的方式来调用bash脚本。 – Harrichael

0

定义一个简单的界面,你的bash脚本和你的Python脚本

它看起来像曾经是打印出来的文件的简单的接口之间,但这种方法并没有扩展到多个文件。现在,我建议界面打印出所创建文件的名称。它看起来像这样:

filenames = subprocess.check_output("./bashscript").split() 
for filename in filenames: 
    with open(filename) as file_obj: 
     file_data = [float(a) for a in file_obj.readlines()] 

它看起来像你不熟悉Python,但熟悉bash。因此,您正在使用bash拐杖进行编程,而应该接受Python并在您的应用程序中使用它。你可能根本不需要bash脚本。

+0

这太棒了,我完全理解它。谢谢你,我确实会考虑尝试完全使用Python。我想我与python的问题是,我必须SSH到其他机器,我还没有找到如何在Python脚本中做。 –

+0

看看这是否可以帮助你:https://stackoverflow.com/questions/3586106/perform-commands-over-ssh-with-python – Harrichael

+0

公平地说,使用bash不是100%不受欢迎的,因为你正在减小通过ssh发送的数据。 – Harrichael

相关问题