私はHaskellから電話したいと思っているいくつかのセージコードを持っています。HaskellからSageを呼ぶ
test.py:
def pytest():
return 3.5+2
Main.hs:
import qualified CPython as Py
import qualified CPython.Protocols.Object as Py
import qualified CPython.Types as Py
import qualified CPython.Types.Module as Py
import qualified CPython.System as Py
import qualified CPython.Types.Float as Py
import qualified Data.Text as T
import GHC.IO.Handle.FD
import Data.Maybe
main :: IO()
main = do
Py.initialize
path <- Py.getPath
Py.setPath $ T.pack $ ".:" ++ T.unpack path -- path to the module to load
test <- Py.importModule $ T.pack "test"
uname <- Py.getAttribute test =<< (Py.toUnicode (T.pack "pytest"))
res <- Py.callArgs uname []
Py.print res stdout
res' <- Py.fromFloat =<< fromJust <$> Py.cast res
print $ (res' + 2.0 :: Double)
私はMain.hsをコンパイルして実行すると、私が手に次のコードでは、純粋なPythonスクリプトを呼び出すためにcpythonを使用しています予想される出力:
5.5
7.5
私はtest.pyするfrom sage import *
を追加した場合、私は私の猫たら(取得ch例外はImportError("No module named 'sage'",)
です。もちろん、test.pyはセージから直接細かくロードします。私はpython
実行ファイルをsage
実行可能ファイルへのシンボリックリンクで置き換えると問題は解決すると思っていましたが、同じエラーが表示されます。
誰かがcpythonをsageや他の方法でHaskellからセージスクリプトを呼び出す方法を知っていますか?
セージはどのようにインストールされていますか? 'print path'を呼び出すとどうなりますか? (セージライブラリがパスに入っていることを確認するだけです) – pdexter
なぜシンボリックリンクを変更すると問題が解決すると思いましたか? Haskellの呼び出しは明らかにCPython APIを直接呼び出しているので、Pythonインタプリタはまったく実行していませんが、CPython APIを使用してHaskellプログラム内に独自のインタプリタを作成します。残念なことに、これはおそらくあなたが考えているシステムディレクトリを見ていないことを意味します。 'sage'パッケージのパスを' sys.path'に追加してみてください。 – Bakuriu
@pdexter奇妙なことに、賢明なビジネスを試みる前でさえ、pythonファイルに "print"を含めると、奇妙なことに構文解析エラーが発生します。 – crockeea