Aus Linux-Magazin 11/2015

Python-Module unter Julia einfach via Pycall aufrufen

© blotty, 123RF

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)
Abbildung 1: Julia erzeugt den Plot mit den angefragten Orten.

Abbildung 1: Julia erzeugt den Plot mit den angefragten Orten.

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 2 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben