2016-11-05 4 views
0

スクリプトをbashで実行すると、エラーが発生する:sh: 2: Syntax error: "|" unexpected。なぜ私はここでパイプラインを使いたいのか分かりませんし、そのコマンドを使ったperlのスクリプトは動作しますが、Pythonではそれが必要です。入力(テキストファイル)のos.system()に渡されたシェルコマンドは失敗します.sh:2:構文エラー: "|"予期しない

例:

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

'os.system'を' print'に置き換えると何が印刷されますか?それは合理的に見えますか? –

+0

あなたはどのオペレーティングシステムを使用していますか? 'man esearch'、' man efetch'、 'man xtract'を読んだことがありますか? –

+0

このubuntuは、このプログラムはncbiからの恩恵です。 – MTG

答えて

2

おそらく無関係な問題は、あなたが適切コマンドで入力と出力ファイル名を引用されていないということです。使用

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

しかし、すべての正当なファイル名(二重引用符を含むファイル名など)であっても、それは絶対ではありません。私はこの問題はnameが入力から読み込ま回線を終端に改行が含まれていることである完全

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

プロセスのうち、殻を残し、os.systemの代わりにsubprocessモジュールを使用することをお勧めします。 nameをシェルコマンドに挿入すると、改行も挿入され、シェルはそれを最初のコマンドの終わりとして扱います。ただし、2行目はパイプ記号で始まります。これは構文エラーです。パイプ記号は同じ行のコマンド間に来なければなりません。それが問題であることを

良いヒントはコマンドは一行だけで構成されているようだながらshは、ライン2でエラーを報告しているという事実に含まれています。しかし、置換後は2行であり、2行目は問題があります。

関連する問題