我正在为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命名空间的路径吗?
非常感谢。
答案 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)))))