|
From: Fernando P. <Fer...@co...> - 2004-10-01 16:40:12
|
John Hunter schrieb:
>>>>>>"Fernando" =3D=3D Fernando Perez <Fer...@co...> writ=
es:
>=20
>=20
> Fernando> I think we're doing pretty good, except that people can
> Fernando> always kill themselves by running true WX/GTK apps via
> Fernando> @run. IPython is really not made for this, it can only
> Fernando> handle gracefully show() calls from pure matplotlib
> Fernando> scripts, not full-blown GUI apps. But I think we have a
> Fernando> very reasonable environment at this point for most usage
> Fernando> cases.
>=20
> It's looks like about 90% of your problems result from trying to cross
> GUI backends within IPython. Is this fair to say?
Well, not quite. As I mentioned, I put in a matplotlib.use() wrapper whi=
ch=20
traps invalid switches, so it's not a problem if a use() call is made. C=
ould=20
you add such a call to this one please? :
// OK with GTKAgg backend. It needs a use('GTKAgg') call to be safe for o=
ther
backends.
run dynamic_image_gtkagg.py
It's only when native GUI examples are run that things crash badly. Note=
that=20
some of the segfaults occur from plain python:
// these are OK with gtkagg, but they segfault wxagg. The segfault happe=
ns
from a normal command line as well (no ipython).
run system_monitor.py
run dynamic_demo.py
And I also have these:
// these two run but segfault on exit under ipython. They run OK from a =
cmd line.
run dynamic_demo_wx.py
run dynamic_image_wxagg.py
I suspect these two are messing something up badly enough that if python =
quits=20
right away, you don't see the problem, but since ipython continues to run=
the=20
interpreter, the problem appears. Since these are segfaults, I'm very mu=
ch=20
willing to blame the wx code in there, and not ipython (which is 100% pur=
e,=20
unpolluted python :)
> As far as I'm concerned I don't have a problem with these cases.
> Caveat emptor -- the user should be forewarned and expect disaster if
> they try and run GUI specific examples from ipython. Perhaps you
> should say pylab only supports pure matlab interface matplotlib at
> this point.
>=20
>>From your end I see why it's a concern - you don't want any run
> command to break or freeze ipython. If you have any ideas on what we
> should do I'll be happy to help on the matplotlib end, but I don't
> have any off the top of my head.
Yes, this is the real nasty. If you think that the ipython+matplotlib=20
combination is going to be a common one in the future for scientists, it =
may=20
be worth protecting the examples against disaster (given they tend to be =
what=20
people run to first). If you are willing to pay the price of 12 lines of=
code=20
per example, you could put this snippet at the beginning of _every_ embed=
ded=20
example:
# Detect if we are inside IPython and bail if so. Threading problems
# make it very difficult to safely run full GTK/WX apps inside IPython.
try:
__IPYTHON__
msg =3D ("This script can NOT be run inside IPython.\n\n"
"It embeds matplotlib into a complete GUI application, and\n"
"for a number of reasons this is (and probably will remain)\n=
"
"unsupported from inside IPython.\n\n"
"You can run it from the command line as a regular python scr=
ipt.\n")
raise RuntimeError,msg
except NameError:
pass
This will make sure that users get a meaningful error message inside ipyt=
hon=20
instead of a bizarre lockup or segfault.
> I'll comment on some of the non cross-GUI problems below....
>=20
> Fernando> // These don't run with LANG=3D=3Dde_DE.UTF-8, but are OK
> Fernando> with en_US.UTF-8 run date_demo_convert.py run
> Fernando> date_demo1.py run date_demo2.py run date_demo_rrule.py
> Fernando> run finance_demo.py
>=20
> Do they run from the shell with LANG=3D=3Dde_DE.UTF-8? Any idea what i=
s
> going wrong?
Yes, the problem has nothing to do with ipython, it also happens with pla=
in=20
python. Note that the broken ones are:
// These don't run with LANG=3D=3Dde_DE.UTF-8, but are OK with en_US.UTF-=
8
run date_demo1.py
run date_demo2.py
run finance_demo.py
I think my original list had more by mistake. Here's a traceback (form=20
ipython, so you get better details):
In [5]: run date_demo1.py
-------------------------------------------------------------------------=
--
ValueError Traceback (most recent call las=
t)
/home/fperez/code/python/pylab/examples/date_demo1.py
26 yearsFmt =3D DateFormatter('%Y')
27
---> 28 quotes =3D quotes_historical_yahoo(
29 'INTC', date1, date2)
30 if not quotes:
/usr/local/lib/python2.3/site-packages/matplotlib/finance.py in=20
quotes_historical_yahoo(ticker, date1, date2)
61 if len(vals)!=3D7: continue
62 datestr =3D vals[0]
---> 63 dt =3D datetime.date(*time.strptime(datestr, '%d-%b-%y')[=
:3])
64 d =3D date2num(dt)
65 open, high, low, close =3D [float(val) for val in vals[=
1:5]]
/usr/src/build/394694-i386/install/usr/lib/python2.3/_strptime.py in=20
strptime(data_string, format)
422 found =3D format_regex.match(data_string)
423 if not found:
--> 424 raise ValueError("time data did not match format: data=3D=
%s=20
fmt=3D%s" %
425 (data_string, format))
426 if len(data_string) !=3D found.end():
ValueError: time data did not match format: data=3D31-Mar-04 fmt=3D%d-%=
b-%y
WARNING: Failure executing file: <date_demo1.py>
The problem is that under different locales, dates come out formatted=20
differently. You seem to have hardcoded format expectations which break =
in=20
the face of non-US locales.
> Fernando> run print_stdout.py
>=20
> This is an example script to show how to print png to stdout from agg.
> Perhaps this fails because ipython doesn't really expect a png coming
> in from stdout? The header of that file states
Well, running it again I'm getting this:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/src/build/394694-i386/install/usr/lib/python2.3/threading.p=
y",=20
line 436, in __bootstrap
self.run()
File "/home/fperez/code/python/IPython/Shell.py", line 527, in run
self.IP.mainloop()
File "/home/fperez/code/python/IPython/iplib.py", line 948, in mainloo=
p
self.interact(banner)
File "/home/fperez/code/python/IPython/iplib.py", line 1036, in intera=
ct
line =3D self.raw_input(prompt)
File "/home/fperez/code/python/IPython/iplib.py", line 1263, in raw_in=
put
return self.prefilter(raw_input(prompt),
IOError: [Errno 9] Ung=FCltiger Dateideskriptor
Pehaps you could add (if you decide that you like that idea) the __IPYTHO=
N__=20
trap code to this as well, so that all examples are made ipython-friendly=
. In=20
this one, the message could additionally show this:
print png to standard out
usage: python print_stdout.py > somefile.png
so users know what to do straight away.
> Thanks for the detailed notes.
No prob. I'm a big believer that good examples are what helps most new u=
sers,=20
so I'm trying to make sure that out-of-the-box, things run as smoothly as=
=20
possible for all those scientists who are just dying to start using matpl=
otlib=20
with ipython :)
Best,
f
|