2016-09-21 81 views
0

我有一個python代碼,我正在調用shell命令。在那裏我做了shell命令代碼的部分是:/bin/sh:line 62:to:command not found

try: 
    def parse(text_list): 
     text = '\n'.join(text_list) 
     cwd = os.getcwd() 
     os.chdir("/var/www/html/alenza/hdfs/user/alenza/sree_account/sree_project/src/core/data_analysis/syntaxnet/models/syntaxnet") 
     synnet_output = subprocess.check_output(["echo '%s' | syntaxnet/demo.sh 2>/dev/null"%text], shell = True) 
     os.chdir(cwd) 
     return synnet_output 
except Exception as e: 
    sys.stdout.write(str(e)) 

現在,當我運行了一些樣品輸入(我做cat /home/sree/example.json | python parse.py),它工作正常本地文件的代碼,我得到所需的輸出。但我想在我的HDFS(相同cat命令,但輸入文件路徑是從HDFS),其中包含完全相同的類型JSON條目的運行與輸入的代碼,它失敗,出現錯誤:

/bin/sh: line 62: to: command not found 
list index out of range 

我讀過堆棧溢出的類似問題,解決方案是爲被調用的shell腳本包含一個Shebang行。我在demo.sh腳本中有shebang行#!/usr/bin/bash

另外,which bash給出/usr/bin/bash

有人請詳細說明。

+0

看起來像你的問題不包括你真正需要幫助的代碼。看看你是否可以削減到[mcve]。 – tripleee

回答

1

你很少,如果有的話,想要結合傳遞一個列表參數與shell=True。你只需要把這個字符串:

synnet_output = subprocess.check_output("echo '%s' | syntaxnet/demo.sh 2>/dev/null"%(text,), shell=True) 

不過,你真的不需要在這裏一個管道。

from subprocess import check_output 
from StringIO import StringIO # from io import StringIO in Python 3 
synnet_output = check_output(["syntaxnet/demo.sh"], 
          stdin=StringIO(text), 
          stderr=os.devnull) 
+0

我仍然得到解決方案1的相同錯誤。它與我的主目錄中的文件運行良好,但在HDFS上輸入失敗。 對於第二個,我得到一個錯誤:'StringIO實例沒有屬性'fileno'' – kskp

+0

這裏有幾個問題。首先,你確定'demo.sh'可以從標準輸入中讀取嗎?其次,HDFS不是一個普通的文件系統,需要使用特殊的工具來與其內容進行交互。 – chepner

+0

我確定'demo.sh'可以從標準輸入讀取。因爲完全相同的代碼適用於我的主目錄中的輸入文件,其中包含HDFS上文件的前4個條目。我假設HDFS上的文件中有一些數據是令人困惑的'demo.sh'。將盡快更新。謝謝你的時間。 – kskp

0

有與出現在我被輸入到demo.sh文本字符串一些特殊字符的問題。我通過將text存儲到臨時文件並將該文件的內容發送到demo.sh來解決此問題。

即:

try: 
    def parse(text_list): 
     text = '\n'.join(text_list) 
     cwd = os.getcwd() 
     with open('/tmp/data', 'w') as f: 
      f.write(text) 
     os.chdir("/var/www/html/alenza/hdfs/user/alenza/sree_account/sree_project/src/core/data_analysis/syntaxnet/models/syntaxnet") 
     synnet_output = subprocess.check_output(["cat /tmp/data | syntaxnet/demo.sh 2>/dev/null"%text], shell = True) 
     os.chdir(cwd) 
     return synnet_output 
except Exception as e: 
    sys.stdout.write(str(e))