0

Clojure 用のサードパーティ ライブラリを作成しています。このライブラリのコアでは、オペレーティング システムからスクリプトを実行する必要があります。この場合、このファイルへの絶対パスをこのように使用することはできません/Users/me/src/clojure-pymorphy/src/pymorphy/pymorphy.py

しかし、相対パスを使用するscript/script.pyと、スクリプトの場所が間違っていると判断される場合があります。この clojure ライブラリを実行/使用するディレクトリによって異なります。このライブラリはサードパーティとして配布されるため、script.pyClojure ソース コードからのパスを特定する方法が必要です。

プロジェクト フォルダは次のようになります。

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 名前空間へのパスを動的に決定する他の方法はありますか?

どうもありがとう。

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 に答える