传递给os.system()的Shell命令失败:sh:2:语法错误:" |"意外

时间:2016-11-05 14:31:34

标签: python bash shell bioinformatics

当我在bash中运行脚本时,出现错误:sh: 2: Syntax error: "|" unexpected。我不知道为什么,我想在这里使用管道,并且使用该命令的perl中的脚本可以工作,但我需要它在Python中。

输入示例(文本文件):

Kribbella flavida
Saccharopolyspora erythraea
Nocardiopsis dassonvillei
Roseiflexus sp.

脚本:

#!/usr/bin/python

import sys import os

input_ = open(sys.argv[1],'r') output_file = sys.argv[2]
#stopwords = open(sys.argv[3],'r')



names_board = []

for name in input_:
    names_board.append(name.rstrip())
    print(name) for row in names_board:    
    print(row)    
    os.system("esearch -db pubmed -query %s | efetch -format xml | xtract -pattern PubmedArticle -element AbstractText >> %s" % (name,
output_file))

2 个答案:

答案 0 :(得分:2)

可能不相关的问题是您没有正确引用命令中的输入和输出文件名。使用

os.system('esearch -db pubmed -query "%s" | efetch -format xml | xtract -pattern PubmedArticle -element AbstractText >> "%s"' % (name, output_file))

但是,即使这对于所有合法文件名(例如包含双引号的文件名)也不是万无一失的。我建议使用subprocess模块而不是os.system,让shell完全退出流程

esearch = ["esearch", "-db", "pubmed", "-query", name]
efetch = ["efetch", "-format", "xml"]
xtract = ["xtract", "-pattern", "PubmedArticle", "-element", "AbstractText"]
with open(sys.argv[2], "a") as output_file:
    p1 = subprocess.Popen(esearch, stdout=subprocess.PIPE)
    p2 = subprocess.Popen(efetch, stdin=p1.stdout, stdout=subprocess.PIPE)
    subprocess.call(xtract, stdin=p2.stdout, stdout=output_file)

答案 1 :(得分:1)

问题是name包含终止从输入读取的行的换行符。当您将name插入到shell命令中时,也会插入换行符,然后shell将其视为第一个命令的结尾。但是,第二行以管道符号开头,这是一个语法错误:管道符号必须位于同一行上的命令之间。

这是一个很好的暗示,问题是sh第2行报告错误,而命令似乎只包含一行。但是,在替换之后,它是两行,第二行是有问题的。