Search code examples
pythonunixwolfram-mathematicamathematica-8mathlink

How to use Mathematica functions in Python programs?


I'd like to know how can I call Mathematica functions from Python.

I appreciate a example, for example, using the Mathematica function Prime.

I had search about MathLink but how to use it in Python is a little obscure to me.

I tried to use a Mathematica-Python library called pyml but I hadn't no sucess, maybe because this lib looks very old (in tutorial says Mathematica 2 or 3).

Tried compile a source in Wolfram/Mathematica/8.0/SystemFiles/Links/Python but ended with several errors when using python 2.6 (documentation says should work to python 2.3 only).

Pythonika is interesting, but, looks like is just to use in Mathematica notebooks and I would like write .py files who calls Mathematica functions.

So, someone knows a good way to write python programs who uses Mathematica functions and can give me an example?


Solution

  • I had found a solution.

    Steps:

    1-Create a script named runMath with the content:

    #!/usr/local/bin/MathematicaScript -script
    
    value=ToExpression[$ScriptCommandLine[[2]]];
    
    (*The next lime prints the script name.*)
    (*Print[$ScriptCommandLine[[1]]];*)
    
    Print[value];
    

    2-I gave execution privilege to the file.

    sudo chmod +x runMath
    

    3-Moved the file to the execution path

    sudo mv runMath /usr/bin/
    

    4-Created a new script called run with the content:

    #!/usr/bin/python
    from subprocess import *
    from sys import *
    
    command='/usr/bin/runMath'
    parameter=argv[1]
    
    call([command,parameter])
    

    5-Moved to the execution path

    sudo mv run /usr/bin
    

    6-Finally, tested it:

    $run Prime[100]
    541
    
    $run 'Sum[2x-1,{x,1,k}]'
    k^2
    
    $run Integrate[Log[x],x]
    -x + x*Log[x]
    
    $run 'Zeta[2]'
    Pi^2/6
    

    You can use with or without '. The ' are needed for commands with spaces.

    $run 'f[n_] := f[n] = f[n - 1] + f[n - 2]; f[1] = f[2] = 1; Table[f[n],{n,5}]'
    {1, 1, 2, 3, 5}
    

    Happy!