実行したいプログラムにバッファリングの問題があるとします。たとえば:
(defun program-stream (program &optional args)
(let ((process (sb-ext:run-program program args
:input :stream
:output :stream
:wait nil
:search t)))
(when process
(make-two-way-stream (sb-ext:process-output process)
(sb-ext:process-input process)))))
は今、私のシステムで、これはcat
で動作します:
CL-USER> (defparameter *stream* (program-stream "cat"))
*STREAM*
CL-USER> (format *stream* "foo bar baz~%")
NIL
CL-USER> (finish-output *stream*) ; will hang without this
NIL
CL-USER> (read-line *stream*)
"foo bar baz"
NIL
CL-USER> (close *stream*)
T
お知らせfinish-output
- このずに、読み出しがハングします。 (force-output
もあります。)
Pythonの対話モードでは、あまりにも、動作します:
CL-USER> (defparameter *stream* (program-stream "python" '("-i")))
*STREAM*
CL-USER> (loop while (read-char-no-hang *stream*)) ; skip startup message
NIL
CL-USER> (format *stream* "1+2~%")
NIL
CL-USER> (finish-output *stream*)
NIL
CL-USER> (read-line *stream*)
"3"
NIL
CL-USER> (close *stream*)
T
しかし、あなたは-i
オプション(または-u
のような同様のオプション)なしでこれをしようとした場合、あなたはおそらく外になります運行は、バッファリングが進行中であるためです。例えば、私のシステムで、tr
からの読み込みがハングします:バッファリングをオフにするスイッチを提供していません
CL-USER> (defparameter *stream* (program-stream "tr" '("a-z" "A-Z")))
*STREAM*
CL-USER> (format *stream* "foo bar baz~%")
NIL
CL-USER> (finish-output *stream*)
NIL
CL-USER> (read-line *stream*) ; hangs
; Evaluation aborted on NIL.
CL-USER> (read-char-no-hang *stream*)
NIL
CL-USER> (close *stream*)
T
tr
以来、私たちは期待してから、この場合unbuffer
にPTYラッパーとのコールを(ラップします):
CL-USER> (defparameter *stream* (program-stream "unbuffer"
'("-p" "tr" "a-z" "A-Z")))
*STREAM*
CL-USER> (format *stream* "foo bar baz~%")
NIL
CL-USER> (finish-output *stream*)
NIL
CL-USER> (read-line *stream*)
"FOO BAR BAZ
"
NIL
CL-USER> (close *stream*)
T
だから、長い話を短く:読む前にストリーム上finish-output
を使用してみてください。それでも問題が解決しない場合は、バッファリングを妨げるコマンドラインオプションを確認してください。それでも動作しない場合は、何らかの種類のpty-wrapperでプログラムをラップすることができます。
@wvxvw確かめてください!しかし、hunspellはプロンプトで対話的に使用できます。私が "hunspell -s"で始めるならば。それで、CLと対話的に動作させることができると私は考えています。確かに最善の方法はhttp://common-lisp.net/project/cffi/でなければなりませんが、私はまだそれを扱う方法を学ぶ必要があります。 –