【问题标题】:Calling Sage from Haskell从 Haskell 调用 Sage
【发布时间】:2016-06-28 19:37:19
【问题描述】:

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

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 并运行它时,我得到了预期的输出:

5.5
7.5

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

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

【问题讨论】:

  • sage是如何安装的?如果您拨打print path 会发生什么? (只要确保 sage 库在路径中)
  • 您为什么认为更改符号链接可以解决问题?您的 Haskell 调用显然是直接调用 CPython API,因此它根本没有运行 Python 解释器,而是使用 CPython API 在 Haskell 程序中创建它自己的解释器。不幸的是,这可能意味着它没有查看您正在考虑的系统目录。尝试在sys.path中添加sage包的路径。
  • @pdexter 奇怪的是,当我在 python 文件中包含“print”时,即使在尝试任何圣人业务之前,我也会遇到解析错误。
  • @Bakuriu 添加sage 可执行文件的路径不起作用(我也不希望它这样做),并添加sage 的python 可执行文件的路径(在SageMath/local/bin 中)没有'也无济于事。
  • 我打算用 Haskell 打印它。您还需要添加 sage 库的路径,而不是可执行文件。

标签: python haskell sage


【解决方案1】:

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

创建链接
$ pwd; local/bin/python --version
/Users/.../Downloads/sage
Python 2.7.10
$

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

【讨论】:

  • 我知道 Sage 使用它自己的 python,这就是我创建符号链接的原因。您的建议与我尝试的有何不同?
  • 我不知道你做了什么,所以我建议这样做;请注意,您说您链接到 Sage 二进制文件而不是关联的 Python 二进制文件(这绝对是不同的)。无论如何,事实证明有 很多 人在没有意识到 Sage 和“它的”Python 的情况下提出这个问题,所以我认为这会有所帮助;不幸的是,除此之外我无能为力,因为我不使用从其他程序调用的 Sage,更不用说从 Haskell(其中我已经编译了两个程序)。
猜你喜欢
  • 2012-04-11
  • 2013-05-13
  • 1970-01-01
  • 2013-07-22
  • 2011-04-21
  • 2017-03-12
  • 2011-06-28
  • 1970-01-01
  • 2017-01-23
相关资源
最近更新 更多