【发布时间】: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 库的路径,而不是可执行文件。