JuliaPythonAdaptor
JuliaPythonAdaptor is a small Julia/Python package that helps you to create relocatable applications integrated with Julia and Python together.
The Julia programs using JuliaPythonAdaptor can be compiled by PackageCompiler
into sysimages or executables that will work on another machine, if binary-compatible.
Note that your Python binaries are NOT bundled in the compiled julia files. You should also provide a proper Python environment for the target machines.
Motivation
At the current stage, a Julia programmer suffers from the following tasks:
-
Setting up a Python environment to work with Julia.
-
Reusing an existing Python/Julia environment from another language.
-
Distributing compiled Julia binaries that interoperate with Python packages.
This project aims at providing a user-friendly approach to address all above issues.
Target Uses
-
Software Integration
If you want to make software that bundle Julia and Python together and make a separated environment, you might consider using this package or refer to the implementation.
-
Simple Python-Julia Interoperability
If your activating environment contains
julia
andpython
, you don't need to consider details.
Installation
-
Install a julia (>= 1.6.1) distribution. Add it to
$PATH
if you want to avoid manual configurations. -
Install a Python (3.7+) distribution. Add it to
$PATH
if you want to avoid manual configurations. -
For the Python distribution:
pip install git+https://github.com/thautwarm/JuliaPythonAdaptor.jl
orpip install JuliaPythonAdaptor
For the Julia distribution:
julia -e "using Pkg; Pkg.add(\"JSON\", \"JuliaPythonAdaptor\")"
Usage
For relocatability, you might add the following environment variables:
Environment Variable | Description | Default Value |
---|---|---|
JP_ADAPTOR_PY_EXE | the Python executable path | python found in $PATH |
JP_ADAPTOR_JL_EXE | the Julia executable path | julia found in $PATH |
JP_ADAPTOR_JL_PROJ | the Julia project that will be activated | the global Julia project |
JP_ADAPTOR_JL_IMAGE | the Julia Sysimage that will be used | decided by the julia program |
JP_ADAPTOR_JL_DEPOT_PATH | deciding JULIA_DEPOT_PATH |
decided by the julia program |
REPL
Then, if you call Python from Julia, import JuliaPythonAdaptor
before you import PythonCall
. If you call Julia from Python, import JuliaPythonAdaptor
before you import juliacall
.
P.S: Due to this issue, tentatively you have to import JuliaPythonAdaptor
in .julia/config/startup.jl
for loading precompiled packages that use PythonCall:
# $JULIA_DEPOT_PATH/config/startup.jl
try
@eval import JuliaPythonAdaptor
catch e
@warn "Error initializing JuliaPythonAdaptor" exception=(e, catch_backtrace())
end
Sysimages or Apps
Tentatively, the package JuliaPythonAdaptor.jl
does not work due to some julia internals. You can use pip
to install the Python package JuliaPythonAdaptor
to setup correct environment and call your sysimage or app:
# sysimage
python -c "import JuliaPythonAdaptor;import os;del os.environ['JULIA_PYTHONCALL_LIBPTR'];os.system('app-with-pythoncall.exe')"
# app
python -c "import JuliaPythonAdaptor;import os;del os.environ['JULIA_PYTHONCALL_LIBPTR'];os.system('julia -Jsys-with-pythoncall.dll')"
I use PyCall, how to use this package?
PyCall is a great package for Julia to call Python, but it so far does not consider much about relocatability and environment separation.
Please refer to these detailed instructions from PyCall to PythonCall. They will help you with migrating your codebase.
Contributions
PRs and issues are welcome.
Besides, this project leverages the mechanism provided by PythonCall.jl, CondaPkg.jl, MicroMamba.jl and pyjuliapkg. You might also consider contributing to them.