2013-01-08 8 views
2

lessc을 통해 읽고 읽었던 파일에 lessc을 실행하고 파일을 엉망으로 만들고 싶지 않습니다. subprocess.check_output 및 Popen.communicate는 빠른 조정이 필요했던 것을 위해 많은 번거 로움을 입증했습니다. 둘 다 아무것도 출력하지 않으며 영원히 기다리지도 않는다. 버퍼 및 기타 등등을 관리하는 일종의 번거 로움없는 편의 기능이 있습니까?짧은 실행 프로세스를 통해 물건을 파이프하고 출력물을 얻는 가장 번거로운 방법은 무엇입니까?

예 출처 :

from subprocess import Popen 
from sys import stderr 

s = """ 
@a: 10px 
foo { 
    width: @a; 
} 
""" 
print("making") 
p = Popen("lessc -", shell=True, stdout=-1, stdin=-1, stderr=stderr) 
print("writing") 
p.stdin.write(bytes(s, "utf-8")) 
print("Waiting") 
p.wait() 
print("readng") 
out = p.stdout.read() 
print(out) 

출력 :

making 
writing 
Waiting 

내가 문제가 단순히이라고 추측하고있어

답변

6

를 (그냥 읽기에 차단하게 대기 부분을 언급) 당신의 Lessc은 단명하지 않습니다. 그것은 절대로 닫히지 않는 표준에서 읽습니다.

표준 입력에서 읽은 다음 입력을 입력 한 다음 간단히 기다렸을 때 (입력 끝을 알리지 않음) 터미널에서 lessc가 어떻게 작동합니까? 그것이 당신의 프로그램이하는 일입니다.

+0

어떻게 닫을까요? – Glycan

+0

p.stdin.close()? – emil

2

다음 코드가 효과가 있습니까?

import subprocess 
import sys 

s = """ 
@a: 10px 
foo { 
    width: @a; 
} 
""" 

p = subprocess.Popen(['lessc', '-'], 
    stdin = subprocess.PIPE, 
    stdout = subprocess.PIPE, 
    stderr = sys.stderr) 

out = p.communicate(s)[0] 
print out