0

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

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

项目文件夹如下所示:

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

脚本pymorphy.pypymorphy.clj. 文件pymorphy.clj从此行开始:

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

我试图找出是否有一种方法可以pymorphy在运行时确定目录到命名空间,只需简单地添加"pymorphy/pymorphy.py"到它。但是经过几个小时的谷歌搜索后,我得出结论,这是不可能的。

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

非常感谢。

4

2 回答 2

2

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

(.getFile (clojure.java.io/resource "pymorphy/pymorphy.py"))
于 2012-08-12T23:16:24.160 回答
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)))))
于 2012-08-13T07:36:01.173 回答