복붙노트

[PYTHON] 파이썬 - 파이프와 쉘 명령을 실행하는 방법?

PYTHON

파이썬 - 파이프와 쉘 명령을 실행하는 방법?

파이썬에서 다음 셸 명령을 실행하고 결과를 얻으려는 경우가 있습니다.

echo This_is_a_testing | grep -c test

이 파이썬 코드를 사용하여 파이썬에서 위의 쉘 명령을 실행할 수 있습니다.

>>> import subprocess
>>> subprocess.check_output("echo This_is_a_testing | grep -c test", shell=True)
'1\n'

그러나 "shell = True"옵션을 사용하고 싶지 않기 때문에 다음 파이썬 코드를 시도해 보았습니다.

>>> import subprocess
>>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE)
>>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout)
>>> p1.stdout.close()
>>> p2.communicate()
(None, None)

왜 웹 페이지의 설명을 참조 했으므로 출력이 "없음"인지 궁금합니다. http://docs.python.org/library/subprocess.html#subprocess.PIPE

내 코드에서 몇 가지 포인트를 놓치셨습니까? 어떤 제안 / 아이디어? 미리 감사드립니다.

해결법

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

    1.매뉴얼에서 :

    매뉴얼에서 :

    p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout, stdout=subprocess.PIPE)
    
  2. ==============================

    2.여기를보세요 :

    여기를보세요 :

    >>> import subprocess
    >>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE)
    >>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=p1.stdout)
    >>> 1
    p1.stdout.close()
    >>> p2.communicate()
    (None, None)
    >>>
    

    여기에 p2 = subprocess.Popen ([ "grep", "-c", "test"], stdin = p1.stdout)을 쓰면 출력이 1이됩니다. 질문의 컨텍스트에서이 출력을 무시하지 마십시오.

    이것이 원하는 경우, 두 번째 Popen에 인수로 stdout = subprocess.PIPE를 전달하십시오.

    >>> p1 = subprocess.Popen(["echo", "This_is_a_testing"], stdout=subprocess.PIPE)
    >>> p2 = subprocess.Popen(["grep", "test"], stdin=p1.stdout, stdout=subprocess.PIPE)
    >>> p2.communicate()
    ('This_is_a_testing\n', None)
    >>>
    
  3. ==============================

    3.

    >>> import subprocess
    
    >>> mycmd=subprocess.getoutput('df -h | grep home | gawk \'{ print $1 }\' | cut -d\'/\' -f3')
    
    >>> mycmd 
    
    'sda6'
    
    >>>
    
  4. ==============================

    4.받아 들인 답이 올 바르고 작동하는 동안 또 다른 옵션은 Popen.communicate () 메서드를 사용하여 뭔가를 프로세스의 표준 입력으로 전달하는 것입니다.

    받아 들인 답이 올 바르고 작동하는 동안 또 다른 옵션은 Popen.communicate () 메서드를 사용하여 뭔가를 프로세스의 표준 입력으로 전달하는 것입니다.

    >>> import subprocess
    >>> p2 = subprocess.Popen(["grep", "-c", "test"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    >>> p2.communicate("This_is_a_testing")
    ('1\n', None)
    >>> print p2.returncode
    0
    >>>>
    

    이것은 출력이 이미 파이썬 스크립트 자체에 알려져 있다면, 출력을 리디렉션하기 위해 다른 명령을 실행할 필요성을 해결합니다.

    그러나 통신에는 프로세스가 종료 될 때까지 기다리는 부작용이 있습니다. 두 프로세스를 사용하여 비동기 실행이 필요하거나 원하는 경우 더 나은 옵션이 될 수 있습니다.

  5. from https://stackoverflow.com/questions/9393425/python-how-to-execute-shell-commands-with-pipe by cc-by-sa and MIT license