Has anyone gotten ExternalEvaluate to work with Anaconda Python on OS X? It used to work for me in the prerelease, but it’s not working in the final release.
In[2]:= py = StartExternalSession["Python"]
Out[2]= ExternalSessionObject["3dac9d41-1400-48be-83ea-9b6012316ff4"]
In[3]:= ExternalEvaluate[py, "1+1"]
During evaluation of In[3]:= Import::nopythonevals: No Python external evaluator found. Use RegisterExternalEvaluator to register an external evaluator.
During evaluation of In[3]:= ExternalEvaluate::interpFail: The result 2 failed to be interpreted as a WL expression. Use "ReturnType"->"String" instead.
Out[3]= $Failed
Notice that Python did return the result 2. What fails is only the translation of this result to Mathematica.
I would like to know if this is broken for everyone or if my system is misconfigured.
After this problem is solved, I would also like to know if it is possible to use different virtualenvs. Can I have multiple external evaluators registered, each corresponding to a specific virtualenv? Update: It seems that virtualenv creates a copy of the python interpreter, thus passing this to RegisterExternalEvaluator should work. But I can’t try until ExternalEvaluate starts working on my system …
The Python expression import functionality seems to rely on a working Python evaluator (see ExternalEvaluate`ImportExport`Symbols`importPythonString).
However, it does not retrieve an evaluator from the list of registered evaluators. Instead, it tries to use various heuristics to find one on the system (see ExternalEvaluate`Private`findLangInstall).
This fails on my system, possibly because I did not install pyzmq for the system’s Python. I do not want to modify the OS’s Python because I use a private installation (Anaconda) instead. This one already has pyzmq installed, as required.
Why won’t Import[..., "PythonExpression"] use the evaluator I registered then? Why does it try to look for an evaluator on its own (and fail)? This seems like a bug.
I didn’t comment on virtualenv further because when I tried it, it worked for me. It is necessary to have pyzmq installed in that virtualenv though. Did you make sure it’s installed?
I know this is an old post, but a lot has changed with ExternalEvaluate and its support of Python. In the current releases ExternalEvaluate will create virtual environments on the fly.
For example, this now creates a Python virtual environment that includes pandas: