Afficher les erreurs et les avertissements dans un bloc de code en mode organisation

10

Je voudrais pouvoir signaler des avertissements et des erreurs lors de l'évaluation d'un bloc de code Python dans un fichier Org.

Lorsqu'un bloc de code contient des erreurs de syntaxe Python, Org les affiche utilement dans un tampon distinct appelé *Org-Babel Error Output*. Ce serait bien de pouvoir envoyer mes propres avertissements là aussi, tout en conservant la possibilité de retourner un résultat de tableau en mode Org en tant que table utilisant :results value.

Pour être clair, voici un exemple factice du genre de chose que je pensais pouvoir fonctionner:

#+BEGIN_SRC python 
    import sys
    sys.stderr.write('Warning.\n')
    sys.stderr.flush()
    return [['Table', 'header'], ['table', 'data']]
#+END_SRC

#+RESULTS:
| Table | header |
| table | data   |

Modifié pour ajouter: Cette discussion sur la liste en mode organisation suggère que la sortie d'erreur ne s'affiche que lorsque l'évaluation du bloc de code échoue. Il semble donc que cela soit possible, mais uniquement en abandonnant l'évaluation à l'aide de exit(1)ou similaire.

Jon O.
la source
La réponse de Constantine fonctionne parfaitement pour moi, si c'est aussi une solution pour vous, veuillez accepter la réponse, si ce n'est pas mettre à jour votre question, s'il vous plaît.
atevm

Réponses:

6

Comme décrit par Eric Schulte sur la org-modeliste de diffusion (voir le lien dans la question) nous pouvons modifier org-babel-evalpour y parvenir:

(defvar org-babel-eval-verbose t
  "A non-nil value makes `org-babel-eval' display")

(defun org-babel-eval (cmd body)
  "Run CMD on BODY.
If CMD succeeds then return its results, otherwise display
STDERR with `org-babel-eval-error-notify'."
  (let ((err-buff (get-buffer-create " *Org-Babel Error*")) exit-code)
    (with-current-buffer err-buff (erase-buffer))
    (with-temp-buffer
      (insert body)
      (setq exit-code
            (org-babel--shell-command-on-region
             (point-min) (point-max) cmd err-buff))
      (if (or (not (numberp exit-code)) (> exit-code 0)
              (and org-babel-eval-verbose (> (buffer-size err-buff) 0))) ; new condition
          (progn
            (with-current-buffer err-buff
              (org-babel-eval-error-notify exit-code (buffer-string)))
            nil)
        (buffer-string)))))

Maintenant, si org-babel-eval-verboseest défini sur t, la sortie imprimée sur stderr pendant l'évaluation d'un bloc de code source apparaît dans une fenêtre distincte comme si l'évaluation du code source avait échoué.

Constantine
la source