为什么我的Clojure Shell结果与Python不同?

3
在Python的repl中,我经常需要编辑多行代码,所以我使用import os,然后运行os.system("notepad npad.py")
在Clojure中,我首先运行(use '[clojure.java.shell :only [sh]]),然后运行(sh "notepad" "jpad.clj")
这样可以启动记事本,但不是一种有用的方式,因为Clojure的repl现在会挂起。换句话说,在我关闭记事本之前,我无法在repl中输入代码,并且我希望两个都保持打开状态。我知道我可以很容易地在不涉及Clojure的情况下打开记事本,所以这并不是什么大问题。但是,是否有一种方法让Clojure启动外部进程而不挂起?
2个回答

5

future 是一种方便的方式,可以在后台运行工作,并且稍后轻松查看进程状态。

user> (def notepad-process (future (sh "emacs" "jpad.clj")))
#'user/notepad-process

编辑文件一段时间,然后稍后检查进程是否退出:

user> @notepad-process
{:exit 0, :out "", :err ""} 

另请参阅Raynes的shell库Conch,以获取通常有用的shell内容。在示例中,future也是他用于运行shell任务而不阻塞repl线程的工具。 - Alex Stoddard
感谢Arthur,future很好用。感谢@Alex提到Conch - exbctel

1

看起来你希望sh立即返回而不是等待记事本的退出代码。如何编写一个sh!宏或类似方法,在新线程上运行原始的sh命令?如果你只在REPL中使用它作为一种方便,那么这完全没有问题。

编辑

Arthur的答案更好,更符合Clojure的风格-采用那个。


谢谢Ben。现在我知道(= pythonic clojurian) -> true。 - exbctel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接