Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell &引用;“劣质”;clojure中的进程-重定向异步输出以进行进一步处理_Shell_Clojure_Future - Fatal编程技术网

Shell &引用;“劣质”;clojure中的进程-重定向异步输出以进行进一步处理

Shell &引用;“劣质”;clojure中的进程-重定向异步输出以进行进一步处理,shell,clojure,future,Shell,Clojure,Future,我想在Clojure中维护一个长时间运行的交互式shell进程——在Emacs中称之为“低级”进程。我认为这个基本思想非常熟悉,因为Clojure本身可以通过苹果酒在Emacs内部运行。我很高兴知道是否有使用Clojure作为顶级流程的这种设置的工作示例 编辑:我找到了这个“要点”,这是一个非常好看的包装,它给了我一些思考的食物 使用我自己的:我无法将字符串输入到python中,并以与使用相同的方式获取输出,例如,cat。但通过一点实验,我找到了基本原理,绕过了第一个障碍 (需要“[me.ray

我想在Clojure中维护一个长时间运行的交互式shell进程——在Emacs中称之为“低级”进程。我认为这个基本思想非常熟悉,因为Clojure本身可以通过苹果酒在Emacs内部运行。我很高兴知道是否有使用Clojure作为顶级流程的这种设置的工作示例

编辑:我找到了这个“要点”,这是一个非常好看的包装,它给了我一些思考的食物

使用我自己的:我无法将字符串输入到
python
中,并以与使用相同的方式获取输出,例如,
cat
。但通过一点实验,我找到了基本原理,绕过了第一个障碍

(需要“[me.raynes.conch.low-level:as-sh]”
(def sh python(sh/proc“python”“-i”);“-i”需要获得交互模式
#'flowrweb.core/sh-python
(未来(sh/流到out sh python:out))
#未来[{:状态:待定,:val nil}0x516f3fff]
(sh/feed来自字符串sh python“1+1\n”);在苹果酒上只返回零
2                                            ;  #'FlowerWeb.core/py-out
(来自字符串sh python“1+2\n”的sh/feed)
;=> 3.
;=> 无
@抽签

^C;"" ; 据我所知,没有Clojure特定的机制来管理流程。此外,操作系统进程不属于严格意义上的Clojure重点,因为它是一种托管语言,进程管理肯定是主机应该管理的事情(例如JVM或CLR)

那么,假设您正在JVM上运行Clojure。JVM为创建子流程而公开的一个功能是,您可以从Clojure代码中调用它,如下所示():


您可以获取sh/proc返回的InputStream,用reader打开它,然后使用line seq创建输出行的延迟序列。这应该在另一个线程上运行,因为doseq将阻塞,直到输出可用

(let [{out-stream :out} (sh/proc "ls" "-l")]
  (with-open [out-rdr (clojure.java.io/reader out-stream)]
    (doseq [line (line-seq out-rdr)]
      ; do something with line: Like feed it into core.async chan
      ; (>!! some-chan line)
      ; or pass it to some fn
      (println line))))

这就足够开始了

(需要“[me.raynes.conch.low-level:as-sh]”
;=> 无
(定义我的stringwriter(java.io.stringwriter.))
;=> #'用户/我的stringwriter
(def sh python(sh/proc“python”“-i”))
;=> #'用户/sh python
(future(sh/streamtoshpython:outmystringwriter));不重定向*out*
;=> #未来[{:status:pending,:val nil}0x4358e46d]
(sh/feed来自字符串sh python“1+1\n”)
;=> 无
(.toString我的stringwriter)
;=> “2\n”
(来自字符串sh python“1+2\n”的sh/feed)
;=> 无
(.toString我的stringwriter)
;=> “2\n3\n”
请记住,“代理系统支持以异步和独立的方式在线程之间共享不断变化的状态”(),我认为封装这一点的合理方法是:

(需要“[clojure.string:as str]”)
(def a-stringwriter(代理(java.io.stringwriter.))
(未来(sh/stream-to-sh-python:out@a-stringwriter))
(defn feed python[用户输入]
(未来(来自字符串sh python的sh/feed(str用户输入“\n”))
(线程/睡眠1000)
(str/split(.toString@a-stringwriter)#“\n”))
然后您可以编写例如
@(feed python“10+20”)
来发送和接收python的结果。此命令将显示以前的交互历史以及最新的交互历史。对于大多数用例,只有最新的添加才是相关的

(defn gljcon[用户输入]
(最后@(提要python用户输入)))

Conch提供了此级别的包装(
sh/proc
)。我看到的是
python
cat
的行为不同——如果我将
1+1\n
馈送到
cat
,我会返回
1+1
。但是如果我把它输入到
python
中,我什么也得不到(而我希望得到
2
)。我现在可以从python中获得打印输出,但需要弄清楚如何访问它进行进一步处理。现在我已经阅读了更多关于未来的内容,我可以看出“第一次尝试”有点愚蠢。未来不会完成,这就是进程挂起的原因。不确定没有str的
有什么问题
尽管尝试!
(let [{out-stream :out} (sh/proc "ls" "-l")]
  (with-open [out-rdr (clojure.java.io/reader out-stream)]
    (doseq [line (line-seq out-rdr)]
      ; do something with line: Like feed it into core.async chan
      ; (>!! some-chan line)
      ; or pass it to some fn
      (println line))))