복붙노트

[HADOOP] / 빈 / SH : 행 62 :에 : 명령을 찾을 수 없습니다

HADOOP

/ 빈 / SH : 행 62 :에 : 명령을 찾을 수 없습니다

내가 쉘 명령을 호출하고있는 파이썬 코드가 있습니다. 내가 쉘 명령은 한 코드의 일부 :

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))

내가 몇 가지 예제 입력이 로컬 파일에이 코드를 실행하면 이제 (내가 그랬어 고양이 /home/sree/example.json가 | 파이썬 parse.py)가 잘 작동하고 내가 필요한 출력을 얻을. 하지만 정확히 포함 JSON 항목의 동일한 유형 내 HDFS의 입력과 코드를 (같은 cat 명령 만 입력 파일 경로가 HDFS에서이다)를 실행하려고하고 그것은 오류와 함께 실패합니다 :

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

내가 스택 오버플로에서 비슷한 질문을 읽고 솔루션은 호출되는 쉘 스크립트의 오두막 라인을 포함하는 것이었다. 나는 오두막 호선을해야합니까! demo.sh 스크립트는 / usr / 빈 / bash는.

또한, 어떤 bash는 것은는 / usr / 빈 / bash에 있습니다.

누군가가 정교하시기 바랍니다.

해결법

  1. ==============================

    1.당신은 거의 경우 지금까지, 쉘 = True를 가진리스트 인수를 전달 결합하려는 없습니다. 그냥 문자열을 전달 :

    당신은 거의 경우 지금까지, 쉘 = 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)
    
  2. ==============================

    2.일부 특수 문자는 내가 demo.sh.에 입력 된 텍스트 문자열에 나타나는 문제가 발생했습니다 나는 demo.sh. 해당 파일의 내용을 임시 파일에 텍스트를 저장하고 전송하여이 문제를 해결

    일부 특수 문자는 내가 demo.sh.에 입력 된 텍스트 문자열에 나타나는 문제가 발생했습니다 나는 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))
    
  3. from https://stackoverflow.com/questions/39619221/bin-sh-line-62-to-command-not-found by cc-by-sa and MIT license