当我在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))
答案 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行报告错误,而命令似乎只包含一行。但是,在替换之后,它是两行,第二行是有问题的。