当我在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))
发布于 2016-11-05 15:18:03
一个可能不相关的问题是,您没有在命令中正确地引用输入和输出文件名。使用
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)
发布于 2016-11-06 00:48:53
问题是name
包含的换行符终止了从输入读取的行。当您在shell命令中插入name
时,也会插入换行符,然后shell会将其视为第一个命令的结尾。但是,第二行以管道符号开头,这是一个语法错误:管道符号必须位于同一行上的命令之间。
sh
在第2行报告了一个错误,而该命令似乎只包含一行,这是一个很好的提示,表明这是问题所在。然而,在替换之后,它是两行,第二行是有问题的。
https://stackoverflow.com/questions/40439374
复制相似问题