Re: [O] odd/unexpected behavior with Python src blocks

2014-09-29 Thread Instructor account
Indeed, this passes by org-babel because stderr is not captured, and
scipy does what you suggest. I guess this happens inside compiled
c/Fortran code since there is nothing catching it in the odeint
python function doing that.

Thanks, I will try to bring it up on the scipy list. 

Aaron Ecay aarone...@gmail.com writes:

 Hi John,

 2014ko irailak 28an, John Kitchin-ek idatzi zuen:

 [...]

 I am not sure why this happens, but it seems like incorrect behavior to
 me.

 In the first case, python exits with a non-zero exit code, whereas in
 the second it exits with a zero code (i.e. successful exit), and prints
 the matrix-thing [[1.], [1.]] to stdout.  It looks like scipy traps the
 NameErrors and prints them to stderr, but continues its computation
 regardless.

 I’d say babel is performing as desired here, but scipy sadly isn’t
 reporting its errors in the standard way (by a nonzero exit, which I
 think would happen automatically if the NameErrors made it to the top
 level of the stack without being caught).

-- 
---
John Kitchin
Professor
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213
412-268-7803
http://kitchingroup.cheme.cmu.edu



Re: [O] odd/unexpected behavior with Python src blocks

2014-09-29 Thread John Kitchin

In case anyone else is interested, here is a workaround of sorts to
capture stderr in a python block:

https://github.com/jkitchin/pycse/blob/master/pycse/sandbox.py

You use this module to redefine stdout and stderr. You basically run
python like this:

#+BEGIN_SRC emacs-lisp
(setq org-babel-python-command python -m pycse.sandbox)
#+END_SRC

Then you get this output.

#+BEGIN_SRC python :results output
from scipy.integrate import odeint

#k = -1

def f(y, x):
return -k * y

print(odeint(f, 1, [0, 1]))
#+END_SRC

#+RESULTS:
#+begin_example
sandbox:
---stdout---
[[ 1.]
 [ 1.]]

---stderr---
Traceback (most recent call last):
  File string, line 6, in f
NameError: global name 'k' is not defined
Traceback (most recent call last):
  File string, line 6, in f
NameError: global name 'k' is not defined
Traceback (most recent call last):
  File string, line 6, in f
NameError: global name 'k' is not defined
Traceback (most recent call last):
  File string, line 6, in f
NameError: global name 'k' is not defined


#+end_example

At least until babel captures stderr, this is a way to capture it. It does 
break the nice behavior of making tables output, since it
prints a string. The string could be orgified somewhat, eg

#+STDOUT:


#+STDERR:

I am not sure I will use this routinely, so I am not sure how much I
will put into furhter development.

Instructor account jkitc...@andrew.cmu.edu writes:

 Indeed, this passes by org-babel because stderr is not captured, and
 scipy does what you suggest. I guess this happens inside compiled
 c/Fortran code since there is nothing catching it in the odeint
 python function doing that.

 Thanks, I will try to bring it up on the scipy list. 

 Aaron Ecay aarone...@gmail.com writes:

 Hi John,

 2014ko irailak 28an, John Kitchin-ek idatzi zuen:

 [...]

 I am not sure why this happens, but it seems like incorrect behavior to
 me.

 In the first case, python exits with a non-zero exit code, whereas in
 the second it exits with a zero code (i.e. successful exit), and prints
 the matrix-thing [[1.], [1.]] to stdout.  It looks like scipy traps the
 NameErrors and prints them to stderr, but continues its computation
 regardless.

 I’d say babel is performing as desired here, but scipy sadly isn’t
 reporting its errors in the standard way (by a nonzero exit, which I
 think would happen automatically if the NameErrors made it to the top
 level of the stack without being caught).

-- 
---
John Kitchin
Professor
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213
412-268-7803
http://kitchingroup.cheme.cmu.edu



[O] odd/unexpected behavior with Python src blocks

2014-09-28 Thread John Kitchin

* Odd behavior in python src-blocks in org-mode

I found that some code blocks in Python execute due to apparently silent
errors! here is how to reproduce it with a vanilla emacs -q.

#+BEGIN_SRC emacs-lisp
(org-babel-do-load-languages
 'org-babel-load-languages
 '((emacs-lisp . t)
   (python . t)))

(setq org-confirm-babel-evaluate nil)
#+END_SRC

#+RESULTS:

This block should raise an error (and does) because k is not defined.
#+BEGIN_SRC python
def f(y, x):
return k * y

print(f(1, 0))
#+END_SRC

#+RESULTS:

It raises this error.

#+BEGIN_EXAMPLE
Traceback (most recent call last):
  File stdin, line 4, in module
  File stdin, line 2, in f
NameError: global name 'k' is not defined
#+END_EXAMPLE

However, this code block actually executes, and gives the wrong answer! If I 
open the source block in Python mode, it does not run without error.

#+BEGIN_SRC python :results output
from scipy.integrate import odeint

def f(y, x):
return k * y

print(odeint(f, 1, [0, 1]))
#+END_SRC

#+RESULTS:
: [[ 1.]
:  [ 1.]]

Here is the correct answer.

#+BEGIN_SRC python :results output
from scipy.integrate import odeint

k = -1
def f(y, x):
return k * y

print(odeint(f, 1, [0, 1]))
#+END_SRC

#+RESULTS:
: [[ 1.]
:  [ 0.36787947]]

I am not sure why this happens, but it seems like incorrect behavior to
me.

-- 
---
John Kitchin
http://kitchingroup.cheme.cmu.edu




Re: [O] odd/unexpected behavior with Python src blocks

2014-09-28 Thread Aaron Ecay
Hi John,

2014ko irailak 28an, John Kitchin-ek idatzi zuen:

[...]

 I am not sure why this happens, but it seems like incorrect behavior to
 me.

In the first case, python exits with a non-zero exit code, whereas in
the second it exits with a zero code (i.e. successful exit), and prints
the matrix-thing [[1.], [1.]] to stdout.  It looks like scipy traps the
NameErrors and prints them to stderr, but continues its computation
regardless.

I’d say babel is performing as desired here, but scipy sadly isn’t
reporting its errors in the standard way (by a nonzero exit, which I
think would happen automatically if the NameErrors made it to the top
level of the stack without being caught).

-- 
Aaron Ecay