关于python:从Haskell调用Sage

Calling Sage from Haskell

我想从 Haskell 调用一些 sage 代码。以下代码使用 cpython 调用纯 python 脚本:

test.py:

1
2
def pytest():
    return 3.5+2

Main.hs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 并运行它时,我得到了预期的输出:

1
2
5.5
7.5

如果我将 from sage import * 添加到 test.py,我会得到(一旦我发现异常)ImportError("No module named 'sage'",)。当然 test.py 可以直接从 sage 加载。我希望用 sage 可执行文件的符号链接替换 ??python 可执行文件可以解决问题,但我仍然遇到同样的错误。

有谁知道如何使 cpython 与 sage 一起工作,或者以任何其他方式从 Haskell 调用 sage 脚本?


真正的问题是您使用的是"哪个"Python; Sage 使用自己的 Python,而不是您的系统 Python。您可能想尝试从

建立链接

1
2
3
4
$ pwd; local/bin/python --version
/Users/.../Downloads/sage
Python 2.7.10
$

原则上,这是您需要链接到的那个。在实践中,您可能想阅读有关更多链接的 Sage 文档,或其他有关运行脚本的博客文章。但无论如何,只有 Python 可以使用 from sage import *.