2016-10-29 3 views
1

서브 프로세스를 사용하여 파이썬 스크립트 내에 unfluff을 실행하려고하는데 결과는 항상 비어 있습니다. 쉘에서 실행하면 괜찮습니다. 내가 통해 웹 페이지의 내용을 추출 할 수 unfluff 문서에서파이썬 서브 프로세스로 unfluff 실행

:

curl -s 'http://observador.pt/2016/10/29/espanha-e-portugal-sao-unicos-paises-da-ue-sem-populismo-xenofobo-diz-antonio-costa' | unfluff 

이 좋은 콘텐츠를 추출 가진 좋은 JSON 결과 다음은 예입니다. 이제 Python으로 내가 사용하고 다음

빈 문자열 결과
import subprocess 

url = 'http://observador.pt/2016/10/29/espanha-e-portugal-sao-unicos-paises-da-ue-sem-populismo-xenofobo-diz-antonio-costa' 

p = subprocess.Popen(['curl','-s',url,'|','unfluff'],stdout=subprocess.PIPE) 
print p.communicate()[0] 

. 그래서 내가 뭘 잘못하고 있니?

답변

2

명령에 |을 사용하면 암시 적으로 OS 쉘을 호출하게됩니다.

따라서 shell=True을 활성화해야합니다.

p = subprocess.Popen(['curl','-s',url,'|','unfluff'],stdout=subprocess.PIPE,shell=True) 

참고 : 다음은 shell=True 매개 변수가 필요하지 않습니다

p1 = subprocess.Popen(['curl','-s',url],stdout=subprocess.PIPE) 
p2 = subprocess.Popen('unfluff',stdin=p1.stdout,stdout=subprocess.PIPE) 
print(p2.communicate()[0]) 

(: 당신이 Popen이 있기 때문에이 같은 예를 들어, 2 개 Popen 인스턴스를 열어 훨씬 깨끗한 방법으로 그것을 할 수 , 편집 : unfluff이 실제로 실행 파일이 아니기 때문에 Popen 일 가능성이 있으므로 매개 변수가 필요합니다.

규칙은 다음과 같습니다. 안전하고 싶다면 항상 shell=True으로 설정하십시오. 그러나 명령 줄은 OS 쉘에 의존하기 때문에 효율성이 떨어집니다. 그래서 그것이 없이는 작동한다면, 그것은 더 좋습니다.

+0

감사합니다. 거의 효과가있었습니다. 나는 지금 json을 얻는다. 그러나 빈 들판을 가지고있다. – Miguel

+0

어떤 해결책을 시도 했습니까? 첫 번째 또는 두 번째? 'shell = True'를'unfluff'에서 두번째 쉘에 추가 할 수 있습니까? –

+0

두번째'unfluff'에'shell = True'를 추가하면 효과가 있습니다. 감사! – Miguel

관련 문제