2013-01-08 1 views
2

Je veux lancer lessc sur certaines choses que j'ai lues/traitées via lessc, et que je ne veux pas déranger avec des fichiers. subprocess.check_output et Popen.communicate se sont révélés être une grande partie de tracas pour quelque chose qui devait être un tweak rapide. Aucun d'entre eux ne sort rien/attend toujours. Y at-il une sorte de fonction de commodité sans tracas qui gère les tampons et autres joyeusetés?Quel est le moyen le plus simple de canaliser les choses à travers un processus de courte durée et obtenir des résultats?

source Exemple:

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) 

Sortie:

making 
writing 
Waiting 

(Commentant la partie d'attente la fait juste bloquer la lecture)

Répondre

6

Je suppose que le problème est simplement que votre lessc n'est pas de courte durée. Il lit à partir de son stdin, que vous ne fermez jamais.

Comment se comporterait lessc dans un terminal si vous le lisiez depuis stdin, y tapiez une entrée, puis attendiez simplement (ne signalant jamais la fin de l'entrée)? C'est ce que fait votre programme.

+0

Comment le fermez-vous? – Glycan

+0

p.stdin.close()? – emil

2

Est-ce que le code suivant fonctionne pour vous?

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 
Questions connexes