Baseado no manual do site orgmode.org.
Incluindo Python como opção para code blocks
Primeiro, alterei a variável do emacs org-babel-do-load-languages para incluir o python. Isso pode ser feito tanto usando o comando customize-variable (M-x customize-variable) como editando diretamente o .emacs .
Usei o customize-variable e adicionei a linguagem Python, já estava na lista o emacs-lisp. No final do processo, o seguinte código foi adicionado ao meu .emacs :
‘(org-babel-load-languages ‘((python . t) (emacs-lisp . t)))
update-alternatives para Python3
Segundo, foi necessário adicionar um atalho para que o comando python executasse diretamente o python3 (estou usando Debian). Eu segui estas instruções.
No meu sistema, esta era a situação:
arkanoid@Sandstorm:~$ python
-bash: python: command not found
arkanoid@Sandstorm:~$ l /usr/bin/pyth*
lrwxrwxrwx 1 root root 9 Mar 2 15:55 /usr/bin/python3 -> python3.9
-rwxr-xr-x 1 root root 5.3M Feb 28 14:03 /usr/bin/python3.9
lrwxrwxrwx 1 root root 33 Feb 28 14:03 /usr/bin/python3.9-config -> x86_64-linux-gnu-python3.9-config
lrwxrwxrwx 1 root root 16 Mar 2 15:55 /usr/bin/python3-config -> python3.9-config
arkanoid@Sandstorm:~$
Ou seja, ele executa como python3 mas não como python. Ocorre que o code block no org-mode tenta executar o comando python. Sendo assim achei mais prático adicionar um atalho do comando python para chamar diretamente o python3.
No Debian, isso foi feito assim:
sudo update-alternatives –install /usr/bin/python python /usr/bin/python3.9 1
Code block de exemplo
Testei o seguinte code block:
+NAME: teste1
+begin_src python
seconds_in_a_day = 24 * 60 * 60
seconds_in_a_day
+end_src
+RESULTS: teste1
: None
Rodando o código com C-c C-c deu o resultado indicado abaixo, “None”. Para o org-mode obter corretamente o resultado do código Python executado é preciso algumas mudanças. Basta por exemplo incluir o comando return no final com a variável. Mas para evitar isso também pode-se incluir no code block os argumentos :session :results value. Assim:
+NAME: teste1
+begin_src python :session :results value
seconds_in_a_day = 24 * 60 * 60
seconds_in_a_day
+end_src
+RESULTS: teste1
: 86400
Incluindo essas opções no cabeçalho do code block ele retorna corretamente a última chamada feita no código em Python, no caso avaliar a variável seconds_in_a_day.