Zeigen Sie Fehler und Warnungen in einem Codeblock im Organisationsmodus an

10

Ich möchte in der Lage sein, Warnungen und Fehler bei der Auswertung eines Python-Codeblocks in einer Org-Datei zu melden.

Wenn ein Codeblock Python-Syntaxfehler aufweist, wird diese von Org in einem separaten Puffer namens aufgerufen *Org-Babel Error Output*. Es wäre schön, dort auch meine eigenen Warnungen senden zu können und gleichzeitig die Möglichkeit zu behalten, ein Array-Ergebnis als Tabelle mit in den Org-Modus zurückzugeben :results value.

Um es klar auszudrücken, hier ist ein Dummy-Beispiel für die Art von Dingen, von denen ich dachte, dass sie funktionieren könnten:

#+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   |

Zum Hinzufügen bearbeitet: Diese Diskussion in der Liste der Organisationsmodi legt nahe, dass die Fehlerausgabe nur angezeigt wird, wenn die Codeblockauswertung fehlschlägt. Es sieht also so aus, als wäre dies möglich, aber nur durch Abbrechen der Auswertung mit exit(1)oder ähnlich.

Jon O.
quelle
Die Antwort von Constantine funktioniert perfekt für mich. Wenn es auch eine Lösung für Sie ist, akzeptieren Sie bitte die Antwort. Wenn Ihre Frage nicht aktualisiert wird, bitte.
Atevm

Antworten:

6

Wie von Eric Schulte auf der org-modeMailingliste beschrieben (siehe den Link in der Frage), können wir dies ändern org-babel-eval, um dies zu erreichen:

(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)))))

Wenn nun org-babel-eval-verbosegesetzt ist, twird die Ausgabe, die während der Auswertung eines Quellcodeblocks an stderr gedruckt wird, in einem separaten Fenster angezeigt, als ob die Auswertung des Quellcodes fehlgeschlagen wäre.

Konstantin
quelle