从clojure确定运行时的文件脚本目录

时间:2012-08-12 22:36:33

标签: clojure namespaces

我正在为Clojure创建第三方库。在这个库的核心,我需要从操作系统运行脚本。在这种情况下,我不能使用此文件的绝对路径,如/Users/me/src/clojure-pymorphy/src/pymorphy/pymorphy.py

但是如果我使用相对路径script/script.py - 有时候脚本的位置可能被确定为错误。这取决于我运行/使用此clojure库的目录。因为这个库将作为第三方分发,我需要从Clojure源代码中确定script.py的路径。

项目文件夹如下所示:

clojure-pymorphy/
    src/
        pymorphy/
            pymorphy.py
        pymorphy.clj

pymorphy.py调用脚本pymorphy.clj。文件pymorphy.clj从以下行开始:

(ns pymorphy
  (:import  (java.util ArrayList)
            (jep Jep)))

我试图找出有没有办法在运行时确定pymorphy命名空间的目录,只需添加"pymorphy/pymorphy.py"即可。{但经过几个小时的谷歌搜索后,我得出的结论是,这是不可能的。

那么还有其他方法可以在运行时动态确定clojure命名空间的路径吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

在查看stackoverflow上的类似问题时,我找到了解决方案:

(.getFile (clojure.java.io/resource "pymorphy/pymorphy.py"))

答案 1 :(得分:1)

如果您要运行此脚本,那么这将是类似的 - 这会将脚本复制到临时文件,然后运行它。你需要创建文件,因为如果你将所有内容打包到jar中,那么解释器将无法读取文件..

(let [tmp (File/createTempFile "tmp" "py")
      script (clojure.java.io/resource "pymorphy/pymorphy.py")]
  (try
    (when (and script (.exists tmp))
      (with-open [os (.openStream script)]
        (clojure.java.io/copy os tmp))
      (run-script....))
    (finally
      (when (.exists tmp)
        (.delete tmp)))))