Skip to main content

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


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 "", line 1, in
mathlink.error: MLGet out of sequence.

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



Answer



This solution can work with several programming languages. Check this GitHub repository of mine.


See this link.



I have found a solution. Works fine to me.


Steps:


1-Create a script named runMath with the content:


#!/usr/bin/env wolframscript
# for certain older versions of Mathematica replace 'wolframscript' by
# 'MathematicaScript -script' in the shebang line

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/local/bin/


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


#!/usr/bin/python
from subprocess import *
from sys import *

command='/usr/local/bin/runMath'
parameter=argv[1]

call([command,parameter])


5-Moved to the execution path


sudo mv run /usr/local/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!


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...