2014-10-01 110 views
1

我试图用Python解析一个文件,使用grep,但它总是停在同一行,我启用了解为什么。我尝试三种不同的方式:Grep突然停止

process = os.popen("grep -A1 "+name+" "+new_hairpins+" | grep -oE '.{0,6}"+seq+".{0,6}'") 
results = process.readlines() 
process.close() 

然后

process = subprocess.Popen("grep -A1 "+name+" "+new_hairpins+" | grep -oE '.{0,6}"+seq+".{0,6}'",stdout=PIPE, stderr=PIPE, shell=True) 
process.wait() 
process_result = process.communicate() 
results = filter(None, process_result[0].split("\n")) 

,并通过一个临时文件

os.system("grep -A1 "+name+" "+new_hairpins+" | grep -oE '.{0,6}"+seq+".{0,6}' > tmp.txt") 
with open("tmp.txt","r") as f : 
    results = f.readlines() 

但脚本总是在相同的线路出现故障。 我手动直接在bash中尝试这一行,它工作....!

所以它可能是从grep的内存问题,我该如何解决这个问题? 非常感谢!

+0

你为什么要调用'grep'作为子进程? Python完全有能力将文件中的行与正则表达式进行比较,而无需使用外部进程。 – geoffspear 2014-10-01 15:39:40

+0

您是否考虑过使用python解析文件,而不是调用外部工具来为您完成这项工作? – 2014-10-01 15:39:42

+0

我这样做是因为使用2 grep比写代码行来做同样的事情更快。更重要的是,grep还不是最优的,所以我重做同样的东西?当然,如果没有解决我的问题,我将不得不在python ... – spacup 2014-10-02 07:05:45

回答

0

我终于找到了问题:我的错!

我发现我在grep的使用,并且我只在代码没有用.close()关闭之前生成的文件new_hairpins ....

由于它工作在1879年第一线,我不认为这个问题可能来自这个文件...

无论如何,感谢您的帮助家伙!

2

需要引用命令行参数,因为有一个在之间的空间:

"grep -A1 '"+name+" "+new_hairpins+"' | grep .... 
     ^      ^

否则,namenew_hairpins将被视为分离参数。

+0

new_hairpins是文件和名称是搜索的术语,所以我不认为引号是解决方案...此外,它是在1879年的第一条线上工作得非常好,并在1880年停止..... – spacup 2014-10-02 07:07:35

+0

@spacup,你能用完整的追溯更新问题吗? – falsetru 2014-10-02 07:08:26

+0

我没有任何回溯...只是结果变量是空的。 – spacup 2014-10-02 07:36:45