2012-08-12 45 views
0

我正在爲Clojure創建第三方庫。在這個庫的核心,我需要從操作系統運行腳本。在這種情況下,我不能使用此文件的絕對路徑,如/Users/me/src/clojure-pymorphy/src/pymorphy/pymorphy.py在運行時從clojure確定文件腳本目錄

但是,如果我使用相對路徑script/script.py - 比有時腳本的位置可能被確定爲錯誤。它取決於我運行/使用這個clojure庫的目錄。由於這個庫將作爲第三方發佈,我需要通過Clojure源代碼來確定script.py的路徑。

項目文件夾看起來是這樣的:

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命名空間的路徑?

非常感謝。

回答

1

如果您運行此腳本,所以這將是這樣 - 這將腳本複製到臨時文件,並運行它。您需要創建文件,因爲如果你收拾一切都變成罐子,然後解釋器將無法讀取文件..

(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))))) 
+0

它以任何方式工作,但如果庫用作第三方,則我的方法不起作用。謝謝 – hsestupin 2012-08-20 19:17:54

2

雖然看着在計算器類似的問題,我找到了解決辦法:

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

要知道,這依賴於對含有的類路徑pymorphy是目錄JVM(嚴格來說是加載調用類的類加載器)。看起來這對你的具體用例來說很好,但這在一般情況下不起作用。 ClassLoader抽象並不強調文件是底層存儲,所以你永遠不能保證獲得文件的絕對路徑,因爲可能沒有這樣的文件。例如,一些clojure生成的類不以這種方式存儲 – sw1nn 2012-08-13 08:26:18

+0

@ sw1nn感謝您的通知,我已經知道它。 – hsestupin 2012-08-13 10:22:41

相關問題