Für Python existiert ein umfangreicher Satz an Modulen für verschiedenste Anwendungsbereiche. Wer als Julia-Programmierer davon profitieren möchte, installiert sich das Pycall-Paket. Damit lassen sich beliebige Python-Module laden und deren Funktionen nutzen.
Julia ist eine noch recht junge Programmiersprache. Auch wenn sich das Angebot an Bibliotheken ständig vergrößert, kann sie noch nicht mit dem funktionalen Umfang der populären Sprachen konkurrieren. Lässt sich ein Problem mit Julia-Paketen nicht lösen, bedient sich der Programmierer einfach bei Python. Das Pycall-Paket installiert er dann wie folgt:
julia> Pkg.add("PyCall")
Will er die aktuelle Entwicklerversion nutzen, ruft er einfach
julia> Pkg.checkout("PyCall")
auf, um das Git-Repository unter Pycall [1] nach der neuesten Version zu befragen. Bei Julia ist es grundsätzlich zu empfehlen, regelmäßig in die Repositories zu schauen, da die Sprache sich schnell entwickelt.
Pycall erwartet als Grundvoraussetzung, dass auf dem System Python und vor allem die Libpython-Bibliothek installiert sind. Danach muss der Entwickler das Paket via »using« laden:
julia> using PyCall
Mit Pycall stehen ihm einige Low-Level-Funktionen zum Arbeiten mit Python zur Verfügung. Zunächst gibt es die »pyimport(s)« -Funktion, die das Modul »s« lädt. Anschließend kann der Programmierer
pycall(function::PyObject,returntype::Type,args...)
verwenden, um die Funktionen dieses Moduls auszuführen. Dies könnte für das Math-Modul konkret so aussehen:
julia> math = pyimport(:math) PyObject <module 'math' (built-in)>julia> pycall(math["sin"],Float64,1) 0.8414709848078965
Diese beiden Befehle laden zunächst das »math« -Modul mit »pyimport()« und rufen dann die Sinusfunktion mit dem Argument »1« auf. Zum direkten Auswerten von Python-Ausdrücken gibt es auch noch die Anweisung »pyeval(s::String, rtype=PyAny; locals…)« , die wie folgt funktioniert:
julia> pyeval("2+5")
7
Oder aber auch:
julia> pyeval("x + y", x=1, y=2)
3
Neben diesen Low-Level-Funktionen enthält Pycall auch das »@pyimport« -Makro, welches das Arbeiten mit Python-Modulen sehr einfach gestaltet:
julia> @pyimport mathjulia> math.sin(math.pi / 4) 0.7071067811865475
Python-Module sind oft geschachtelt. Diese muss Julia dann extra importieren wie in folgendem Beispiel:
@pyimport numpy.random as nr nr.rand(3,4)
Mit »@pyimport« lassen sich also beliebige Python-Module bequem importieren und direkt unter Julia aufrufen.
Julia greift auf Google Maps zu
Aktuell enthält Julia kein Paket, um mit dem Google-Maps-Dienst zu arbeiten. Statt mühselig selbst eines hierfür zu entwickeln, verwendet der Programmierer einfach das Google-Maps-Python-Paket [2]. Der Benutzer installiert es zuerst einfach via »pip« :
sudo pip install -U googlemaps
Dann muss er noch schnell einen Google-API-Schlüssel generieren. Das ist in ein paar Schritten getan, die [2] genau erklärt. Wichtig ist dabei, die verschiedenen von Google Maps benötigten Funktionen zu aktivieren. Ist all das erledigt, kann man via Pycall auf das Python-Modul und so auf Google Maps zugreifen. Folgendes Beispiel findet für eine bestimmte Adresse die geografische Breite und Länge heraus:
julia> using PyCalljulia> @pyimport googlemapsjulia> apikey="AIza..."julia> gmaps = googlemaps.Client(key=apikey)julia> result = gmaps[:geocode]("1600 Amphitheatre Parkway, Mountain View, CA")julia> println(result[1]["geometry"]["location"]["lat"])
37.4223781julia> println(result[1]["geometry"]["location"]["lng"])
-122.0841909
Der API-Schlüssel ist im Beispiel nur gekürzt wiedergegeben. Mit dem kompakten Code ist es möglich, von Julia aus auf Google Maps zuzugreifen. Die »gecode()« -Methode liefert eine Reihe von Informationen zur hier angegebenen Adresse, von denen lediglich Breite und Länge auszugeben sind.
Julia erlaubt es aktuell noch nicht, den ».« -Operator zu überladen. Aus diesem Grund musste das Beispiel auf die »geocode()« -Funktion via »[:gecode]« statt wie üblich mit »gmaps.geocode« zugreifen.
Plotting unter Julia
In der Tat sind einige zentrale Pakete von Julia derzeit einfach nur Wrapper von Python-Paketen, da dies zumindest kurzfristig die schnellere Lösung ist als eine komplette Neuentwicklung. Basierend auf Pycall sind so beispielsweise auch die Pyside- und Pyplot-Pakete implementiert. Pyside erlaubt Zugriff auf das gleichnamige Python-Paket zum Entwickeln von Qt-GUI-Applikationen, Pyplot ist ein Interface zur ausgereiften Matplotlib-Bibliothek von Python. Pyplot lässt sich wie alle Julia-Pakete einfach über
julia> Pkg.add("PyPlot")
installieren. Ein Plot lässt sich nun – wie unter Matplotlib üblich – folgendermaßen bauen:
julia> x = [-pi:0.2:pi];julia> plot(x, sin(x), ".")
Diese wenigen Zeilen erzeugen einen Plot der Sinusfunktion und stellen diese im Matplotlib-typischen GUI-Dialog dar. Pyplot lässt sich auf diese Weise dazu einsetzen, die Breiten- und Längenangaben mehrerer Orte zu verbinden. Listing 1 erzeugt den in Abbildung 1 gezeigten Plot, auf dem die angefragten Orte eingetragen sind.
Listing 1
Pyplot
01 using PyCall
02 using PyPlot
03
04 @pyimport googlemaps
05 apikey="AIza..."
06 gmaps = googlemaps.Client(key=apikey)
07 locations=["San Francisco", "Sydney", "Tokyo", "Moscow", "Buenos Aires", "Cape Town"]
08 x=[]
09 y=[]
10 for i=1:length(locations)
11 result = gmaps[:geocode](locations[i])
12 x=append!(x,[result[1]["geometry"]["location"]["lng"]])
13 y=append!(y,[result[1]["geometry"]["location"]["lat"]])
14 text(x[i],y[i], locations[i])
15 end
16 plot(x,y, "-",ms=5.0,lw=0.5)
17 plot(x,y, ".",ms=10.0)
18 xlabel("longitude")
19 ylabel("latitude")
20 xlim([-180,180])
21 ylim([-90,90])
22 sleep(60)
Fazit
Durch den einfachen Zugriff auf Python steht dem Julia-Entwickler eine sehr umfangreiche und ausgegorene Sammlung von Modulen direkt zur Verfügung. Programmierer können damit also problemlos sehr schnell produktiven Code unter Julia entwickeln und müssen nicht erst auf die Entstehung eines passenden Julia-Pakets warten. Für Python-Entwickler bietet dies andererseits Vorteile für einen Umstieg auf Julia.
Infos
- Pycall: https://github.com/stevengj/PyCall.jl
- Google-Maps-Paket: https://github.com/googlemaps/google-maps-services-python






