Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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).

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

Old Edit:

Maybe this edit can help someone who wants to use mathlinks directly.

To another solution, please see the answer accepted.

Using the Wolfram/Mathematica/8.0/SystemFiles/Links/Python I could had sucess in compiling the module changing some things in setup.py.

My architechture is x86-64.

1-Change the mathematicaversion to 8.0.

2-Changing the lib name ML32i3 to ML64i3.

3-Copying the file Wolfram/Mathematica/8.0/SystemFiles/Libraries/Linux-x86-64/libML64i3.so to the path pointed in setup.py library_dirs = ["/usr/local/Wolfram/Mathematica/" + mathematicaversion + "/SystemFiles/Links/MathLink/DeveloperKit/Linux/CompilerAdditions"].

5-Compiling the source with sudo python setup.py build.

6-Installing the lib with sudo python setup.py install

4-Editing the file /etc/ld.so.conf and putting the line include /usr/local/lib.

5-Creating a directory in /usr/local/lib/python2.6/dist-packages/mathlink with the lib libML64i3.so.

6-Running sudo ldconfig

I had tested the scripts guifrontend.py with python guifrontend.py -linkname "math -mathlink" -linkmode launch and textfrontend.py with python textfrontend.py -linkname "math -mathlink" -linkmode launch and worked fine.

Looks like I almost. But the script

>>> from mathlink import *
>>> import exceptions,sys, re, os
>>> from types import ListType
>>> mathematicaversion = "8.0"
>>> os.environ["PATH"] = "/usr/local/Wolfram/Mathematica/" + mathematicaversion + ":/usr/local/bin:/usr/bin:/bin"
>>> e = env()
>>> sys.argv=['textfrontend.py', '-linkname', 'math -mathlink', '-linkmode', 'launch']
>>> kernel = e.openargv(sys.argv)
>>> kernel.connect()
>>> kernel.ready()
0
>>> kernel.putfunction("Prime",1)
>>> kernel.putinteger(10)
>>> kernel.flush()
>>> kernel.ready()
0
>>> kernel.nextpacket()
8
>>> packetdescriptiondictionary[3]
'ReturnPacket'
>>> kernel.getinteger()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
mathlink.error: MLGet out of sequence.

breaks in the last command and I don't know why. How can I fix this?

share|improve this question
    
Mathematica comes with Python bindings. They are found in SystemFiles/Links/Python in the Mathematica installation directory. You need to compile the C language part yourself before you can use this. This link is unsupported an the readme file says: "WRI has made no attempt to make the mathlink module compliant with versions of Python newer than 2.3.". I never used it so I can't tell you if it works with newer Pythons, but I'd give it a try. –  Szabolcs Apr 23 '12 at 7:33
    
@Szabolcs. I tried to build the module to use this link. Unfortunally no sucess. Several error ocurrs when trying to run python setup.py build. –  GarouDan Apr 23 '12 at 7:48
    
Well, what errors did you get and what have you tried to do to fix them? Have you read the documentation on how to compile? –  Szabolcs Apr 23 '12 at 7:58
    
In documentations says the first thing is run this command (above) to create the module. The erros are so large that flooded my shell. See a part of it here. I think solve all of this is out of my hands. –  GarouDan Apr 23 '12 at 8:03
1  
Are there specific Mathematica only functions that you need to call? If not, it's quite likely that another library implements what you're after. numpy is an extensive math library for Python, for example. –  Peter Apr 23 '12 at 11:19
show 12 more comments

3 Answers

up vote 6 down vote accepted

See this link.

I have found a solution. Works fine to me.

Steps:

1-Create a script named runMath with the content:

#!/usr/local/bin/MathematicaScript -script

value=ToExpression[$ScriptCommandLine[[2]]];

(*The next line 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 ou without '. The ' are needed to command 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!

share|improve this answer
add comment

I haven't done this before, so can't share any useful experiences, but you can try using JLink from Jython to connect to Mathematica. I am fairly sure that the amount of glue code necessary will be quite small.

A quick hack to make your attempt for PyhtonLink work would be to add the folder with the mentioned shared lib to LD_LIBRARY_PATH (Linux). You can do so by modifying some global scripts, or you can start your process in a shell script, having first redefined LD_LIBRARY_PATH there.

share|improve this answer
    
Leonid, thx about your clue. Firstly I will try just with python as I'm trying above. But if I do not have any success I will try Jython^^. Anyway, if you can take the time to look at this and get a running code I would like to know. Thx. –  GarouDan Apr 23 '12 at 18:10
    
@GarouDan I will keep this in mind, and try it when I get some time on my hands, but this won't probably be until the end of the week. –  Leonid Shifrin Apr 23 '12 at 18:19
    
Leonid, I had found a solution. Take a look after. Thx about your help. –  GarouDan Apr 23 '12 at 19:51
add comment

You can call Mathematica function in Python using the Python MathLink module (the source you found in .../SystemFiles/Links/Python), though you'll need to edit a couple of setup files to get it up and running (support@wolfram.com should be able to help you out there).

To use Prime from Python you would run something like:

kernel.ready()

0

kernel.putfunction("Prime",1)

kernel.putinteger(10)

kernel.flush()

kernel.ready()

1

kernel.nextpacket()

3

packetdescriptiondictionary[3]

'ReturnPacket'

kernel.getinteger()

29

share|improve this answer
    
Looks like I'm almost nikko^^. Almost everything runned but the final command breaks. Could you take a look in this pastebin link and tell to me what's going on? –  GarouDan Apr 23 '12 at 17:50
    
Thx a lot about your help nikko. –  GarouDan Apr 23 '12 at 19:54
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.