2016-06-28 1 views
1

私は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からセージスクリプトを呼び出す方法を知っていますか?

+0

セージはどのようにインストールされていますか? 'print path'を呼び出すとどうなりますか? (セージライブラリがパスに入っていることを確認するだけです) – pdexter

+1

なぜシンボリックリンクを変更すると問題が解決すると思いましたか? Haskellの呼び出しは明らかにCPython APIを直接呼び出しているので、Pythonインタプリタはまったく実行していませんが、CPython APIを使用してHaskellプログラム内に独自のインタプリタを作成します。残念なことに、これはおそらくあなたが考えているシステムディレクトリを見ていないことを意味します。 'sage'パッケージのパスを' sys.path'に追加してみてください。 – Bakuriu

+0

@pdexter奇妙なことに、賢明なビジネスを試みる前でさえ、pythonファイルに "print"を含めると、奇妙なことに構文解析エラーが発生します。 – crockeea

答えて

1

本当の質問はあなたが使っているPythonです。 SageはシステムPythonではなく、独自のPythonを使用します。

$ pwd; local/bin/python --version 
/Users/.../Downloads/sage 
Python 2.7.10 
$ 

これは、リンクする必要のあるリンクです(原則)。実際には、より多くのリンクについてのSageのドキュメント、または実行中のスクリプトに関するその他のblog postsを読むことができます。しかし、とにかくそれは唯一のfrom sage import *を使用できるPythonです。

+0

私はSageが独自のPythonを使用していることを知っています。そのため、シンボリックリンクを作成しました。あなたの提案は私が試したものとどう違うのですか? – crockeea

+0

私はあなたがしたことを知らなかったので、私はこれを提案しました。 * Sage *バイナリにリンクし、関連する* Python *バイナリにはリンクしていないと言います(これは間違いありません)。とにかく、セージとその "Python"についてこれを理解することなく、人々の多くがこのことについて尋ねると分かりました。だから私はこれが役に立つと思っていました。残念ながら、私は他のプログラムから呼び出されたSageを使用しないので、私はこれを助けることができません。それはHaskellだけではなく(2つのプログラムを正確にコンパイルしました) – kcrisman