Magic commands

Magic commands#

Podemos listar los comandos disponibles con:

%lsmagic
Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %code_wrap  %colors  %conda  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %mamba  %man  %matplotlib  %micromamba  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%code_wrap  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

Algunos comandos son interactivos:

%quickref

Y podemos cargar la ayuda de un comando añadiendo ? al final de su nombre

%macro?
%env
{'SELENIUM_JAR_PATH': '/usr/share/java/selenium-server.jar',
 'CONDA': '/usr/share/miniconda',
 'GITHUB_WORKSPACE': '/home/runner/work/taller-python-tools/taller-python-tools',
 'JAVA_HOME_11_X64': '/usr/lib/jvm/temurin-11-jdk-amd64',
 'PKG_CONFIG_PATH': '/opt/hostedtoolcache/Python/3.11.9/x64/lib/pkgconfig',
 'GITHUB_PATH': '/home/runner/work/_temp/_runner_file_commands/add_path_7918c491-52c9-41ff-a0df-4724afa63dd6',
 'GITHUB_ACTION': '__run_2',
 'JAVA_HOME': '/usr/lib/jvm/temurin-11-jdk-amd64',
 'GITHUB_RUN_NUMBER': '28',
 'RUNNER_NAME': 'GitHub Actions 39',
 'GRADLE_HOME': '/usr/share/gradle-8.10',
 'GITHUB_REPOSITORY_OWNER_ID': '890104',
 'ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE': '/opt/actionarchivecache',
 'XDG_CONFIG_HOME': '/home/runner/.config',
 'Python_ROOT_DIR': '/opt/hostedtoolcache/Python/3.11.9/x64',
 'DOTNET_SKIP_FIRST_TIME_EXPERIENCE': '1',
 'ANT_HOME': '/usr/share/ant',
 'JAVA_HOME_8_X64': '/usr/lib/jvm/temurin-8-jdk-amd64',
 'GITHUB_TRIGGERING_ACTOR': 'sergiopasra',
 'pythonLocation': '/opt/hostedtoolcache/Python/3.11.9/x64',
 'GITHUB_REF_TYPE': 'branch',
 'HOMEBREW_CLEANUP_PERIODIC_FULL_DAYS': '3650',
 'ANDROID_NDK': '/usr/local/lib/android/sdk/ndk/27.1.12297006',
 'BOOTSTRAP_HASKELL_NONINTERACTIVE': '1',
 'PWD': '/home/runner/work/taller-python-tools/taller-python-tools',
 'PIPX_BIN_DIR': '/opt/pipx_bin',
 'STATS_TRP': 'true',
 'GOROOT_1_20_X64': '/opt/hostedtoolcache/go/1.20.14/x64',
 'GITHUB_REPOSITORY_ID': '334481971',
 'DEPLOYMENT_BASEPATH': '/opt/runner',
 'GITHUB_ACTIONS': 'true',
 'STATS_VMD': 'true',
 'ANDROID_NDK_LATEST_HOME': '/usr/local/lib/android/sdk/ndk/27.1.12297006',
 'SYSTEMD_EXEC_PID': '591',
 'GITHUB_SHA': '8f4a209b38f2a4652b6c94fa866ba960a2c6ee42',
 'GITHUB_WORKFLOW_REF': 'sergiopasra/taller-python-tools/.github/workflows/main.yml@refs/heads/main',
 'POWERSHELL_DISTRIBUTION_CHANNEL': 'GitHub-Actions-ubuntu22',
 'RUNNER_ENVIRONMENT': 'github-hosted',
 'STATS_EXTP': 'https://provjobdsettingscdn.blob.core.windows.net/settings/provjobdsettings-0.5.181+6/provjobd.data',
 'DOTNET_MULTILEVEL_LOOKUP': '0',
 'GITHUB_REF': 'refs/heads/main',
 'RUNNER_OS': 'Linux',
 'GITHUB_REF_PROTECTED': 'false',
 'HOME': '/home/runner',
 'GITHUB_API_URL': 'https://api.github.com',
 'LANG': 'C.UTF-8',
 'RUNNER_TRACKING_ID': 'github_8766758e-0629-48b1-a921-9023489dc2f1',
 'RUNNER_ARCH': 'X64',
 'GOROOT_1_21_X64': '/opt/hostedtoolcache/go/1.21.13/x64',
 'RUNNER_TEMP': '/home/runner/work/_temp',
 'GITHUB_STATE': '/home/runner/work/_temp/_runner_file_commands/save_state_7918c491-52c9-41ff-a0df-4724afa63dd6',
 'EDGEWEBDRIVER': '/usr/local/share/edge_driver',
 'JAVA_HOME_21_X64': '/usr/lib/jvm/temurin-21-jdk-amd64',
 'GITHUB_ENV': '/home/runner/work/_temp/_runner_file_commands/set_env_7918c491-52c9-41ff-a0df-4724afa63dd6',
 'GITHUB_EVENT_PATH': '/home/runner/work/_temp/_github_workflow/event.json',
 'INVOCATION_ID': '7067065901a546edaa29731eb98f2805',
 'STATS_D': 'true',
 'GITHUB_EVENT_NAME': 'push',
 'GITHUB_RUN_ID': '10829451790',
 'JAVA_HOME_17_X64': '/usr/lib/jvm/temurin-17-jdk-amd64',
 'ANDROID_NDK_HOME': '/usr/local/lib/android/sdk/ndk/27.1.12297006',
 'GITHUB_STEP_SUMMARY': '/home/runner/work/_temp/_runner_file_commands/step_summary_7918c491-52c9-41ff-a0df-4724afa63dd6',
 'HOMEBREW_NO_AUTO_UPDATE': '1',
 'GITHUB_ACTOR': 'sergiopasra',
 'NVM_DIR': '/home/runner/.nvm',
 'SGX_AESM_ADDR': '1',
 'GITHUB_RUN_ATTEMPT': '1',
 'STATS_RDCL': 'true',
 'ANDROID_HOME': '/usr/local/lib/android/sdk',
 'GITHUB_GRAPHQL_URL': 'https://api.github.com/graphql',
 'ACCEPT_EULA': 'Y',
 'RUNNER_USER': 'runner',
 'STATS_UE': 'true',
 'USER': 'runner',
 'GITHUB_SERVER_URL': 'https://github.com',
 'STATS_V3PS': 'true',
 'PIPX_HOME': '/opt/pipx',
 'GECKOWEBDRIVER': '/usr/local/share/gecko_driver',
 'STATS_EXT': 'true',
 'CHROMEWEBDRIVER': '/usr/local/share/chromedriver-linux64',
 'SHLVL': '1',
 'ANDROID_SDK_ROOT': '/usr/local/lib/android/sdk',
 'VCPKG_INSTALLATION_ROOT': '/usr/local/share/vcpkg',
 'GITHUB_ACTOR_ID': '890104',
 'RUNNER_TOOL_CACHE': '/opt/hostedtoolcache',
 'ImageVersion': '20240908.1.0',
 'Python3_ROOT_DIR': '/opt/hostedtoolcache/Python/3.11.9/x64',
 'DOTNET_NOLOGO': '1',
 'GITHUB_WORKFLOW_SHA': '8f4a209b38f2a4652b6c94fa866ba960a2c6ee42',
 'GITHUB_REF_NAME': 'main',
 'GITHUB_JOB': 'deploy-book',
 'LD_LIBRARY_PATH': '/opt/hostedtoolcache/Python/3.11.9/x64/lib',
 'XDG_RUNTIME_DIR': '/run/user/1001',
 'AZURE_EXTENSION_DIR': '/opt/az/azcliextensions',
 'PERFLOG_LOCATION_SETTING': 'RUNNER_PERFLOG',
 'STATS_VMFE': 'true',
 'GITHUB_REPOSITORY': 'sergiopasra/taller-python-tools',
 'Python2_ROOT_DIR': '/opt/hostedtoolcache/Python/3.11.9/x64',
 'ANDROID_NDK_ROOT': '/usr/local/lib/android/sdk/ndk/27.1.12297006',
 'CHROME_BIN': '/usr/bin/google-chrome',
 'GOROOT_1_22_X64': '/opt/hostedtoolcache/go/1.22.7/x64',
 'GITHUB_RETENTION_DAYS': '90',
 'JOURNAL_STREAM': '8:17261',
 'RUNNER_WORKSPACE': '/home/runner/work/taller-python-tools',
 'LEIN_HOME': '/usr/local/lib/lein',
 'LEIN_JAR': '/usr/local/lib/lein/self-installs/leiningen-2.11.2-standalone.jar',
 'GITHUB_ACTION_REPOSITORY': '',
 'PATH': '/opt/hostedtoolcache/Python/3.11.9/x64/bin:/opt/hostedtoolcache/Python/3.11.9/x64:/snap/bin:/home/runner/.local/bin:/opt/pipx_bin:/home/runner/.cargo/bin:/home/runner/.config/composer/vendor/bin:/usr/local/.ghcup/bin:/home/runner/.dotnet/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
 'RUNNER_PERFLOG': '/home/runner/perflog',
 'GITHUB_BASE_REF': '',
 'GHCUP_INSTALL_BASE_PREFIX': '/usr/local',
 'CI': 'true',
 'SWIFT_PATH': '/usr/share/swift/usr/bin',
 'ImageOS': 'ubuntu22',
 'STATS_D_D': 'true',
 'GITHUB_REPOSITORY_OWNER': 'sergiopasra',
 'GITHUB_HEAD_REF': '',
 'GITHUB_ACTION_REF': '',
 'GITHUB_WORKFLOW': 'deploy-book',
 'DEBIAN_FRONTEND': 'noninteractive',
 'GITHUB_OUTPUT': '/home/runner/work/_temp/_runner_file_commands/set_output_7918c491-52c9-41ff-a0df-4724afa63dd6',
 'AGENT_TOOLSDIRECTORY': '/opt/hostedtoolcache',
 '_': '/opt/hostedtoolcache/Python/3.11.9/x64/bin/jupyter-book',
 'JPY_PARENT_PID': '1776',
 'PYDEVD_USE_FRAME_EVAL': 'NO',
 'TERM': 'xterm-color',
 'CLICOLOR': '1',
 'FORCE_COLOR': '1',
 'CLICOLOR_FORCE': '1',
 'PAGER': 'cat',
 'GIT_PAGER': 'cat',
 'MPLBACKEND': 'module://matplotlib_inline.backend_inline'}

%run permite ejecutar otros cuadernos. Las variables pasan a estar definidas dentro del cuaderno presente

%run Fibonacci.ipynb
../_images/3fb11c98c26d9432c5bb3c1ff4b9b49424a8e3d2eb513cef0d96b1da1b496859.png
fib
<function __main__.fib(n: int)>

Podemos ver funciones y variables definidas con %who y %whos

%who
fib	 fibs	 ns	 plt	 
%whos
Variable   Type        Data/Info
--------------------------------
fib        function    <function fib at 0x7f8eb8315b20>
fibs       list        n=10
ns         range       range(0, 10)
plt        module      <module 'matplotlib.pyplo<...>es/matplotlib/pyplot.py'>

Vamos a usar %timeit para comparar la velocidad de ejecución de la versión simple de fib con la fórmula de Binet

import math

SQRT5 = math.sqrt(5)
PHI = (1 + SQRT5) / 2

def fibbn(n):
    """Fibonacci number, Binet's formula"""
    return round((PHI**n - (1-PHI)**n)/SQRT5)
%timeit fibbn(20)
252 ns ± 7.5 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit fib(20)
1.15 ms ± 4.84 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

Podemos llamar a comandos del sistema y alamacenar los resultados en variables

files = !ls
print(files)
['Fibonacci.ipynb', 'Magics.ipynb', 'SNIa_medidas.csv', 'cfibonacci.ipynb', 'ide.md', 'jconvert.md', 'jremote.md', 'jupyter.md', 'magicmd.ipynb', 'magics.md', 'prac_estat.ipynb', 'python.md', 'sec2.md', 'widgets.md']
%sx ls
['Fibonacci.ipynb',
 'Magics.ipynb',
 'SNIa_medidas.csv',
 'cfibonacci.ipynb',
 'ide.md',
 'jconvert.md',
 'jremote.md',
 'jupyter.md',
 'magicmd.ipynb',
 'magics.md',
 'prac_estat.ipynb',
 'python.md',
 'sec2.md',
 'widgets.md']
%%bash

for nm in *.md; do
    echo $nm
done
ide.md
jconvert.md
jremote.md
jupyter.md
magics.md
python.md
sec2.md
widgets.md

Algunos paquetes proporcionan comandos mágicos adicionales.

Instalamos Cython para poder escribir directamente cython en las celdas y rpy2 para escribir R.

rpy2 permite además comunicar datos entre Python y R.

%pip install Cython
# %conda install Cython
Requirement already satisfied: Cython in /opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages (3.0.11)
Note: you may need to restart the kernel to use updated packages.
# Cargando un "cell magic" proporcionado por Cython
%load_ext Cython
%%cython

import math


cdef double SQRT5 = math.sqrt(5)
cdef double PHI = (1 + SQRT5) / 2

def fibcy(int n):
    cdef int res
    res = round((PHI**n - (1-PHI)**n)/SQRT5)
    return res
%timeit fibcy(20)
140 ns ± 0.698 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)