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

(待機部分をコメントアウトすると、読み取りがブロックされます)

4

2 に答える 2

6

問題は単にあなたのlesscが短命ではないということだと思います。それはあなたが決して閉じないそのstdinから読んでいます。

stdinから読み取り、入力を入力してから、単に待機した場合(入力の終了を通知しない場合)、lesscは端末でどのように動作しますか?それがあなたのプログラムがしていることです。

于 2013-01-08T22:46:05.117 に答える
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
于 2013-01-08T22:53:18.587 に答える