Paquetes en Julia - II
Ulises M. Alvarez

Objetivo

Hacer una función local que facilite y acelere la instalación de paquetes al ejecutar programas o libretas de jupyter.

La función

En la libreta, "Paquetes en Julia" (https://github.com/umalvarez/TallerJuR/blob/master/julia/PaquetesEnJulia.ipynb) solicitamos una función que:

  • Verifique si un paquete está o no instalado.
  • Si no está instalado, debe descargarlo y cargarlo a la REPL.
  • Si ya está instalado, debe cargarlo a la REPL.

Instrumentación

Nuestra instrumentación no puede cargar el paquete a la REPL, i.e.:

using package

Pero sí hace lo siguiente:

  1. Verifica que el paquete exista en Pkg.available().
  2. Verifica si el paquete está, o no, instalado.
  3. Si el paquete no está instalado, lo instala mediante Pkg.add().

In [1]:
function p_it(p::AbstractString)
    # Instala el paquete 'p'
    #
    # Args:
    #   p: el nombre completo del paquete::AbstractString
    #
    # Returns:
    #   Mensaje de advertencia o notifica de la instalación vía Base.Pkg.add
    #
    ENV["PYTHON"]=""                                
    if !contains(==, Pkg.available(), p)            
        println("No disponible en Pkg.available().")
    else                                                     
        if !haskey(Pkg.installed(), p)              
            Pkg.add(p)                              
        end
    end
end


Out[1]:
p_it (generic function with 1 method)

In [2]:
methods(p_it)  # Obtenemos la tabla de métodos para it()


Out[2]:
1 method for generic function p_it:
  • p_it(p::AbstractString) at In[1]:10

Pruebas de la función

Errores por el 'tipo' del argumento


In [3]:
p_it(4)        # ¿Y si ingresamos un entero?


MethodError: no method matching p_it(::Int64)
Closest candidates are:
  p_it(::AbstractString) at In[1]:10

Stacktrace:
 [1] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/uma/.julia/v0.6/IJulia/src/execute_request.jl:160
 [2] eventloop(::ZMQ.Socket) at /home/uma/.julia/v0.6/IJulia/src/eventloop.jl:8
 [3] (::IJulia.##11#14)() at ./task.jl:335

In [4]:
p_it(1.0)      # ¿Y si ingresamos un real?


MethodError: no method matching p_it(::Float64)
Closest candidates are:
  p_it(::AbstractString) at In[1]:10

Stacktrace:
 [1] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/uma/.julia/v0.6/IJulia/src/execute_request.jl:160
 [2] eventloop(::ZMQ.Socket) at /home/uma/.julia/v0.6/IJulia/src/eventloop.jl:8
 [3] (::IJulia.##11#14)() at ./task.jl:335

In [5]:
p_it(IJulia)    # El nombre es correcto, pero no el tipo.


MethodError: no method matching p_it(::Module)
Closest candidates are:
  p_it(::AbstractString) at In[1]:10

Stacktrace:
 [1] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/uma/.julia/v0.6/IJulia/src/execute_request.jl:160
 [2] eventloop(::ZMQ.Socket) at /home/uma/.julia/v0.6/IJulia/src/eventloop.jl:8
 [3] (::IJulia.##11#14)() at ./task.jl:335

Errores por nombre inexistente


In [6]:
p_it("Ijulia")  # Ingresamos un nombre incorrecto.


No disponible en Pkg.available().

Paquete ya instalado

Ahora, ingresaremos como argumento de la función un nombre correcto pero esperamos que no haga nada porque el paquete ya estaba instalado:

Pkg.status()
23 required packages:
 ...
 - IJulia                        1.5.0
 ...
121 additional packages:
 - ArgParse                      0.5.0
 ... 
 - ZMQ                           0.4.3

In [7]:
p_it("IJulia")  # Nombre y tipo correctos, pero el paquete ya estaba instalado.

Instalamos un paquete válido

Finalmente, probamos a instalar un paquete con el que no contábamos, IJuliaPortrayals, que nos servirá para embeber elementos HTML, videos, imágenes, etc., en nuestras libretas de jupyter.


In [34]:
p_it("IJuliaPortrayals")


INFO: Cloning cache of IJuliaPortrayals from https://github.com/jbn/IJuliaPortrayals.jl.git
INFO: Installing IJuliaPortrayals v0.0.4
INFO: Building Conda
INFO: Building MbedTLS
INFO: Building ZMQ
INFO: Building IJulia
INFO: Installing Jupyter via the Conda package.
INFO: Found Jupyter version 4.3.0: /home/uma/.julia/v0.5/Conda/deps/usr/bin/jupyter
Writing IJulia kernelspec to /home/uma/.julia/v0.6/IJulia/deps/julia-0.6/kernel.json ...
Installing julia kernelspec julia-0.6
[InstallKernelSpec] Removing existing kernelspec in /home/uma/.local/share/jupyter/kernels/julia-0.6
[InstallKernelSpec] Installed kernelspec julia-0.6 in /home/uma/.local/share/jupyter/kernels/julia-0.6
INFO: Package database updated

Verificamos la instalación exitosa:

Pkg.status()
24 required packages:
 ...
 - IJulia                        1.5.0
 - IJuliaPortrayals              0.0.4
 ...
121 additional packages:
 ...

Por Hacer (TODO)

  • Modificar para que pueda aceptar múltiples argumentos; i.e.:
p_it("PyPlot", "Plots")
  • Investigar el mecanismo para instalar y cargar los paquetes; i.e.:
Pkg.add()
using

Para saber más:

Funciones en Julia

Reproducibilidad


In [8]:
versioninfo()


Julia Version 0.6.0-rc2.0
Commit 68e911be53* (2017-05-18 02:31 UTC)
Platform Info:
  OS: Linux (x86_64-solus-linux)
  CPU: Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
  WORD_SIZE: 64
  BLAS: libopenblas (NO_AFFINITY CORE2)
  LAPACK: libopenblas
  LIBM: libopenlibm
  LLVM: libLLVM-4.0.0 (ORCJIT, haswell)

In [9]:
Dates.today()


Out[9]:
2017-06-26