2014-09-19 5 views
1

나는 명령을 파이썬 스크립트에 포함시키고 출력을 캡처하고 싶습니다.파이썬에서 복잡한 셸 명령의 출력을 캡처하십시오.

grep "rabbit" `find . -name "*.txt"` 

내가 파이썬 2.6을 실행 해요 :이 시나리오에서 나는 하위 디렉토리의 불확정 다수의 파일의 불확정 번호를 확인 "find"를 사용하고, 문자열을 같은 것을 일치하는 각 파일을 grep을 위해 노력하고있어. 6 (예, 죄송 합니다만, 지금 당장은 전체 조직을 움직일 수는 없습니다.)

여기에 제안 된 subprocess, shlex 등을 사용하여 여러 가지를 시도했지만이 구문을 찾지 못하거나 "find ...를 빠는 구문을 찾지 못했습니다. "as the search string for grep` 등 제안이 감사드립니다. 켄 그것은 쉽게 'subprocess.call (..., 쉘 = 참)`하지만 쉘의 이러한 사용을 사용하여 수행 할 수 있습니다

+1

실제로 안전하지 않은 파이썬 코드를 만든다. 왜 Python에서 디렉토리를 탐색하지 않고 파이썬에서 grep이하는 일을 수행할까요? 그것은 매우 간단하고 코드를 더 이식성있게 만듭니다. – 5gon12eder

+0

@ 5gon12eder 결국이 작업을 수행 할 수도 있지만 명령 출력으로이 혼란을 일으키는 방법을 알아 내려고했습니다. os.walk()를보고있었습니다. 또한 5,600 개의 파일을 구문 분석해야하는 경우 "mygrep"은 "realgrep"만큼 빠르지 않을 수도 있습니다. 아직도, 나는 traverse/python이 훌륭한 선택이라는 것에 동의한다. 토끼가 발견되는 것보다 오랜 시간이 걸리는 것을 발견 한 후에 일어날 것이기 때문이다. – Ken

+0

관련 : [파이프로 여러 프로세스를 연결하기 위해 subprocess.Popen을 어떻게 사용합니까?] (http://stackoverflow.com/q/295459/4279) – jfs

답변

2
import subprocess 


find_p = subprocess.Popen(["find", ".", "-name", "*.txt"], stdout=subprocess.PIPE) 
grep_p = subprocess.Popen(["xargs", "grep", "rabbit"], stdin=find_p.stdout) 

grep_p.wait() 
+2

이'grep'은 파일 대신 파일 이름 목록에있는 "rabbit"를 가리 킵니다. 말하자면, 그것은'find를 모방합니다. -name "* .txt"| OP 명령 대신 grep "rabbit"를 사용하십시오. – 5gon12eder

+0

@ 5gon12eder 아 사실 내가 간과하면 xargs를 사용할 수 있습니다. 동일하지는 않지만 작동해야합니다. – GP89

+0

감사합니다. 이것은 두 번째 화신으로 훌륭하게 작동하는 것 같습니다. 나는 결국 위의 제안 된 파이썬 트래버스/구문 분석을 수행 할 수 있지만이 일을 신속하게 얻을 도움이 될 것입니다. - 켄 – Ken

관련 문제