2016-06-28 7 views
1

У меня есть код мудреца, который я хотел бы позвонить из Haskell. Следующий код использует cpython назвать чисто питон скрипт:Calling Sage из Haskell

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, я получаю (как только я кот ch исключение) ImportError("No module named 'sage'",). Конечно, test.py загружается штрафом непосредственно от мудреца. Я ожидал, что замена исполняемого файла python символической ссылкой на исполняемый файл sage устранит проблему, но я все равно получаю ту же ошибку.

Кто-нибудь знает, как заставить cpython работать с шалфеем или любым другим способом вызвать скрипт sage из Haskell?

+0

Как установлен шалфей? Что произойдет, если вы назовете «путь печати»? (просто убедитесь, что библиотеки мудрецов находятся на пути) – pdexter

+1

Почему вы считаете, что изменение символической ссылки устранит проблему? Ваш вызов Haskell, очевидно, напрямую вызывает API CPython, поэтому он вообще не использует интерпретатор python, но он * создает * свой собственный интерпретатор внутри программы Haskell с использованием API-интерфейса CPython. К сожалению, это, вероятно, означает, что он не смотрит на системный каталог, о котором вы думаете. Попробуйте добавить путь к пакету 'sage' в' sys.path'. – Bakuriu

+0

@pdexter Странно, я получаю ошибки разбора, когда включаю «печать» в файле python, даже перед тем, как попробовать любой бизнес шалфея. – crockeea

ответ

1

Реальный вопрос: «какой» Python вы используете; Sage использует собственный Python, а не вашу систему Python. Вы можете попробовать сделать ссылку от

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

Это, с вашей точки зрения, нужно связывать, в принципе. На практике вам может понадобиться прочитать документацию Sage о дополнительных ссылках или другие blog posts о запуске скриптов. Но в любом случае это только тот Python, который может использовать from sage import *.

+0

Я знаю, что Sage использует собственный python, поэтому я создал символическую ссылку. Как ваше предложение отличается от того, что я пробовал? – crockeea

+0

Я не знал, что вы сделали, поэтому я предложил это; обратите внимание, что вы говорите, что вы связаны с двоичным файлом * Sage *, а не с соответствующим * Python * (что определенно отличается). В любом случае, оказывается, что * много * людей спрашивают об этом, не осознавая этого в отношении Sage и «своего» Python, поэтому я думал, что это будет полезно; к сожалению, я не могу помочь в этом, так как я не использую Sage из других программ, не говоря уже о Haskell (из которых я собрал именно две программы). – kcrisman