There is a start of a Python -> Julia interface contained in IJulia. I
was playing around with making importing julia functions more idiomatic
here https://github.com/jakebolewski/pyjulia. Its a bit of a hack at the
moment but it enables you to do things like:
julia:
module Test
function foo(x::Integer)
return x^2
end
end
python:
from julia.Test import foo
foo(10) # => 100
or
from julia import Test as jtest
jtest.foo(10) # => 100
It uses PyCall under the hood. The julia object won't be gc'd as long as
you hold a reference to it on the Python side.
I'm waiting on
https://github.com/JuliaLang/julia/pull/4997<https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2FJuliaLang%2Fjulia%2Fpull%2F4997&sa=D&sntz=1&usg=AFQjCNEecsvLAsFmkFeDlCOuefg6x7M2ww>
to
be merged before working on this further, as it addresses most
of the roadblock's I encountered when working on this. I don't know how
sophisticated you're interop needs to be put if you only need to pass
simple data-structures (array's, list's, dict's) to a julia function,
*interop* already works well with PyCall without delving into the c-api.
Best,
Jake
On Monday, January 13, 2014 11:09:35 AM UTC-5, Alexey Radul wrote:
>
> Hi all,
>
> I'm on a team that has a Python/C++ hybrid application -- Python
> frontend calling into a C++ backend. In what I imagine to be a common
> use case for Julia, we are experimenting with rewriting the C++
> backend in Julia; but while the rewrite itself went well, we're having
> trouble getting the Python frontend to call the draft Julia backend.
> Where by "having trouble" I mean nothing we've tried worked. Has
> anyone on this list successfully does this? How?
>
> Here is the context, the set of things we looked at, and what
> happened.
>
> Context:
> - Everything is on Ubuntu 12.04
> - We have both 32-bit and 64-bit machines, but most experimentation
> has been on 32-bit machines
> - We are building dev Julia from source (pulled around two days ago)
>
> Attempts:
>
> 1) We looked briefly at using PyCall, but all the documentation
> describes calling Python from Julia, so we haven't tried it. We would
> love to know if someone has had success calling Julia from Python with
> PyCall.
>
> 2) The Embedding Julia [1] page looked promising. It describes
> calling Julia from C, but since we already had a link from our Python
> frontend to our C++ backend via Boost::Python, we decided to try it.
> - At first, it completely didn't work. So, after grovelling the
> Internet for a while, we figured that the best thing to do was to
> fork Julia and merge https://github.com/JuliaLang/julia/pull/4997 in
> our fork.
> - Ultimately, the embedding.c example mentioned on said Embedding
> Julia page built and ran successfully, but our attempts to get the
> same code to run in our context failed with mysterious segfaults. [2]
> Our best guess is that the problem is that julia.h is actually a C
> header file, and attempting to include it form a C++ header file is
> producing disasters; but I, at least, do not have the chops to have
> already worked around that.
> Has anybody successfully called Julia from Python via a C++ shim and
> Boost::Python? What do you have to do for that to work?
>
> 3) I imagine it's possible to use one of the ways to call C (as
> opposed to C++) from Python, and then call Julia from C, but that
> seemed even more complicated, so we haven't tried it. Any success on
> this path?
>
> 4) Said Python frontend is only ~4K line of code, plus ~3K lines of
> tests; the main libraries it uses are a parsing library and HTTP
> (client and server). Would it be simpler to just rewrite it in
> Julia as well?
>
> Constraints we have (in case any of these are difficult):
> - We would like to maintain a long-lived Julia object, keep it from
> being garbage-collected, and repeatedly call from Python various
> Julia functions that operate on it.
> - We would like to pass structured data across those calls in both
> directions (e.g., nested lists and dicts on the Python side; but we
> can write custom code to build up and destructure corresponding
> Julia data).
> - We don't actually need to pass callbacks in either direction.
>
> Thank you in advance for your help,
> ~Alexey Radul
>
> [1] http://docs.julialang.org/en/latest/manual/embedding/
>
> [2] GDB said something like
> (gdb) print jl_unbox_float64(fl_box_float64(2.0))
> #1 1563740
> (gdb) print jl_unbox_float64(fl_box_float64(2.0))
> #2 1563780
> Sorry, I don't have the actual number, but it was a large and changing
> integer instead of the 2 I expected.
>
>