5
$\begingroup$

[My related question: mwe-for-compiling-functions-into-standalone-dll-and-calling-them-in-python - here I am exploring an alternative]

I have downloaded, installed and activated the wolfram engine (12.0) on Windows, and I have installed the WolframClient in my Python environment.

In python I execute

from wolframclient.language import wl
from wolframclient.evaluation import WolframLanguageSession
kernelLoc = 'C:\\Program Files\\Wolfram Research\\Wolfram Engine\\12.0\\WolframKernel.exe'
session = WolframLanguageSession(kernelLoc)
session.evaluate(wl.StringReverse('abc'))

and the result is 'cba' proving that the integration is working.

I have a workbook that contains all my (valid) compilable functions.

Question: how do I load & evaluate that notebook and call the compiled functions? (I could use a package file instead if that would help)

I have not (yet) found the answer by reference to the Wolfram Client documentation

Side issue: I recall that setting up my MMA 11.0.1.0 to work with Visual Studio 2017 for C compilation was... tricky. Does the Wolfram Engine have independent setup and if so how do I apply the working config for compilation from MMA to WE? Of course, if I can load the required notebook and it just works then this becomes redundant, but... expect the not-to-be-unexpected is my motto for development.

Update

Loading a Notebook requires FrontEnd, which is not available; I tried to import using NotebookImport, passing a filename and using "Input" as the style filter but also to no avail

using

nbPath = 'A:\\My Documents\\...\\ctXi_WolframEngine.nb'
mynb = session.evaluate(wl.NotebookImport(nbPath,'Input'))
mynb

I got this, which is clearly not helpful

(HoldComplete[None],
 HoldComplete[None],
 HoldComplete[None],
 HoldComplete[None],
 Failure['InterpretationFailure', {'CellStyle': 'Input', 'ContentData': BoxData, 'Cell': RawBoxes[Cell[BoxData['~'], 'Input', Rule[CellChangeTimes, (3771391298.009615,)]]]}],
 HoldComplete[None],
...

Note that the notebook works perfectly well in Mathematica itself.

$\endgroup$
  • $\begingroup$ You can open a notebook with wolframplayer (in Executables of your Wolfram Engine installation folder) and copy/paste the code. $\endgroup$ – Fortsaint Nov 25 '19 at 0:15
  • $\begingroup$ @Fortsaint How would I connect to wolframplayer from Python in order to pass parameters and execute functions? $\endgroup$ – Julian Moore Nov 25 '19 at 21:21
  • $\begingroup$ Did you try NotebookImport[ .. , _->"Text" ] ? $\endgroup$ – Fortsaint Dec 4 '19 at 15:47
2
$\begingroup$

Provided that $Path contains an appropriate path to a package CTMisc.m the following works

session.evaluate(wlexpr('Needs["CTMisc`"]'))

Then I was able to successfully call a function yyyymmddhhmmssmsDateString[milliseconds_] defined in that package

t = session.evaluate(wlexpr('yyyymmddhhmmssmsDateString[3407800000]'))
print(t)

1900-02-09 10:36:40.000

One must be careful with the expression of strings: contexts as strings are usually written as "MyContext`" in Mathematica. I had a problem when I was trying to be too literal and declared

pkgName = '"MyContext`"'

Specified correctly one can also write e.g.

session.evaluate(wl.Get("MyContext`"))

The following function was defined in the package:

compiledTestFunction = 
Compile[{{n, _Real}, {m, _Real}},
    Module[{},
        Return[n * m]
    ];
    CompilationTarget->"C", "RuntimeOptions"->"Speed"];

After Get-ting the package we define the Python function and then execute

compiledTestFunctionPython = session.function('compiledTestFunction')
compiledTestFunctionPython(2.0, 7.0)

and the result is as expected, 14.0

Conclusion: Wolfram Engine on Windows 10 with Visual Studio 2017 worked out of the box for C compilation on this MWE.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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