The first problem was to tell deno_python where to find the Python interpreter, since I am using pyenv to manage my Python versions:
➜ deno_python pyenv version
3.11.4 (set by /Users/casianorodriguezleon/.pyenv/version)
➜ deno_python pip --version
pip 23.2.1 from /Users/casianorodriguezleon/.pyenv/versions/3.11.4/lib/python3.11/site-packages/pip (python 3.11)
It can be achieved by setting the DENO_PYTHON_PATH environment variable:
export DENO_PYTHON_PATH=/Users/casianorodriguezleon/.pyenv/versions/3.11.4/lib/libpython3.11.dylib
One we have it the problem was to install the matplotlib module:
deno run -A --unstable hello.ts
error: Uncaught PythonError: No module named 'matplotlib'
So, let's go and install it:
➜ deno_python pip install matplotlib
Collecting matplotlib
Obtaining dependency information for matplotlib from https://files.pythonhosted.org/packages/7e/2c/1e25437f4419f2828bbd213be42c8fd23a3b795c5c4bb776987d177fc615/matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl.metadata
...
and run it again:
➜ deno_python deno run -A --unstable hello.ts
Matplotlib is building the font cache; this may take a moment.
2023-08-20 11:38:41.135 deno[17398:76256] +[CATransaction synchronize] called within transaction
2023-08-20 11:38:41.479 deno[17398:76256] +[CATransaction synchronize] called within transaction
This module provides a seamless integration between deno and python by integrating with the Python/C API. It acts as a bridge between the two languages, enabling you to pass data and execute python code from within your deno applications. This enables access to the large and wonderful python ecosystem while remaining native (unlike a runtime like the wondeful pyodide which is compiled to wasm, sandboxed and may not work with all python packages) and simply using the existing python installation.
Import any locally installed Python package, for example, matplotlib:
import { python } from "https://deno.land/x/python/mod.ts";
const np = python.import("numpy");
const plt = python.import("matplotlib.pyplot");
const xpoints = np.array([1, 8]);
const ypoints = np.array([3, 10]);
plt.plot(xpoints, ypoints);
plt.show();When running, you must specify --allow-ffi, --allow-env and --unstable
flags. Alternatively, you may also just specify -A instead of specific
permissions since enabling FFI effectively escapes the permissions sandbox.
deno run -A --unstable <file>Normally deno_python follows the default python way of resolving imports, going
through sys.path resolving them globally, locally or scoped to a virtual
environment. This is great and allows you to manage your python dependencies
for deno_python projects in the same way you would any other python project
using your favorite package manager, be it
pip,
conda or
poetry.
This may not be a good thing though, especially for something like a deno module
which may depend on a python package. That is why the ext/pip
utility exists for this project. It allows you to install python dependencies
using pip, scoped to either the global deno installation or if defined the
--location passed to deno without leaking to the global python scope. It uses
the same caching location and algorithm as
plug and
deno cache.
To use ext/pip for python package management you simply use
the provided import or install methods. The rest is handled automatically
for you! Just take a look!
import { pip } from "https://deno.land/x/python/ext/pip.ts";
const np = await pip.import("numpy");
const plt = await pip.import("matplotlib", "matplotlib.pyplot");
const xpoints = np.array([1, 8]);
const ypoints = np.array([3, 10]);
plt.plot(xpoints, ypoints);
plt.show();Check out the docs here.
This module uses FFI to interface with the Python interpreter's C API. So you
must have an existing Python installation (with the shared library), which is
something like python310.dll, etc.
Python installed from Microsoft Store does not work, as it does not contain shared library for interfacing with Python interpreter.
If the module fails to find Python, you can add the path to the Python in the
DENO_PYTHON_PATH environment variable.
DENO_PYTHON_PATH if set, must point to full path including the file name of
the Python dynamic library, which is like python310.dll (Windows),
libpython310.dylib (macOS) and libpython310.so (Linux) depending on
platform.
- DjDeveloper (@DjDeveloperr)
- Elias Sjögreen (@eliassjogreen)
Pull request, issues and feedback are very welcome. Code style is formatted with
deno fmt and commit messages are done following Conventional Commits spec.
Copyright 2021, DjDeveloperr.
Copyright 2023, the Denosaurs team. All rights reserved. MIT license.