복붙노트

[HADOOP] subprocess.check_output () 모듈 객체의 속성이 'check_output'입니다.

HADOOP

subprocess.check_output () 모듈 객체의 속성이 'check_output'입니다.

하위 프로세스 라이브러리를 가지고 놀고 있습니다. 나는 수행 할 수있다.

v = subprocess.check_output ( "ls")

그리고 그것은 잘 작동합니다. 그러나, 내가 기계로 SSH하고 hadoop 명령을 수행하고자 할 때,

v = subprocess.check_output ( "hadoop fs -ls / path / to / file * | grep -oE '/(.*)'")

나는 얻다

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'check_output'

왜 확실하지. 하위 프로세스에 대한 이해가 부족한 것 같습니다. 이 오류를 어떻게 해결할 수 있습니까?

해결법

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

    1.check_output은 파이썬 2.7에서 소개되었으므로 <2.7에서는 작동하지 않습니다.

    check_output은 파이썬 2.7에서 소개되었으므로 <2.7에서는 작동하지 않습니다.

    Popen과 의사 소통을 통해 출력물을 얻을 수 있습니다.

    from subprocess import PIPE,Popen
    proc = Popen(['ls', '-l'], stdout=PIPE)
    print(proc.communicate()[0].split())
    

    문서의이 부분은 유용 할 수 있습니다.

  2. ==============================

    2.다음은 파이썬 2.6 용 subprocess.check_output 함수의 제 버전입니다. 그리고 습관적인 명령 인터페이스와 함께 파이프 라인을 지원합니다.

    다음은 파이썬 2.6 용 subprocess.check_output 함수의 제 버전입니다. 그리고 습관적인 명령 인터페이스와 함께 파이프 라인을 지원합니다.

    import subprocess
    
    def check_output(cmd):
        """ https://docs.python.org/2/library/subprocess.html#subprocess.Popen
            Implementation subprocess.check_output() for Python 2.6
         """
        process_list = []
        cmd_list = cmd.strip().split("|")
        for i, sub_cmd in enumerate(cmd_list):
            STDIN = None
            if i > 0:
                STDIN = process_list[i - 1].stdout
            process_list.append(subprocess.Popen(sub_cmd, stdin=STDIN, stdout=subprocess.PIPE, shell=True))
        if len(process_list) == 0:
            return ''
        output = process_list[i].communicate()[0]
        return output
    

    시험 통화 :

    print check_output('ls -la /var | grep log')
    

    산출:

  3. ==============================

    3.padraic-cunningham, 당신의 대답은 저에게 거기있는 길을 얻었습니다. 제 경우에는 명령이 SSH 명령입니다. 통신이 조기에 프로세스를 죽이기 때문에 (EOF 문자를 읽 자마자) 다음과 같은 결과가 더 좋아졌습니다.

    padraic-cunningham, 당신의 대답은 저에게 거기있는 길을 얻었습니다. 제 경우에는 명령이 SSH 명령입니다. 통신이 조기에 프로세스를 죽이기 때문에 (EOF 문자를 읽 자마자) 다음과 같은 결과가 더 좋아졌습니다.

    import subprocess
    
    def check_output(command_list):
        proc = subprocess.Popen(command_list, stdout=subprocess.PIPE)
        proc.wait()
        return proc.stdout.read()
    
  4. from https://stackoverflow.com/questions/26894024/subprocess-check-output-module-object-has-out-attribute-check-output by cc-by-sa and MIT license