[SciPy-dev] gui_thread and wxPython-2.5.2.8

Fernando Perez Fernando.Perez at colorado.edu
Fri Oct 1 12:54:39 EDT 2004


Prabhu Ramachandran schrieb:

> I have a question that you might be able to help with.  I want to do
> this:
> 
>     Create a module that shadows an existing module in the filesystem.
>     Lets say, site-packages/wx/__init__.py.  I want to create a new
>     module with code that does something else (and not have to create
>     a file!).  Like say: "def f(): print 'hello world'", call that the "wx"
>     module, and make Python believe nothing is wrong (insert it into
>     sys.modules or whatever) then do a 'reload(wx)' to re-read the
>     real __init__.py just like normal.  I'd like the code to be simple
>     and not have to use complex import hooks.
> 
> Is this possible?  If it is I could probably eliminate the wxPython
> patch.

I think it is possible.  You can fool python's idea of what a module is quite 
easily:

In [14]: sys.modules['code'] = sys.modules['time']

In [15]: code.<TAB>
code.accept2dyear  code.daylight      code.strftime      code.tzname
code.altzone       code.gmtime        code.strptime      code.tzset
code.asctime       code.localtime     code.struct_time
code.clock         code.mktime        code.time
code.ctime         code.sleep         code.timezone

These are all time's functions :)

In [15]: reload code
-------> reload(code)
Out[15]: <module 'time' from '/usr/lib/python2.3/lib-dynload/timemodule.so'>

So I think what you have in mind should work.  My only concern is that you 
seem to want to reload the _original_ wx/__init__.py, so I'm not sure I 
understand correclty where you want to do the trapping.  But overall, I think 
this kind of game can _definitely_ be played from the outside of Wx.  This is 
one of the benefits of python's extremely strong dynamic nature.

Best,

f




More information about the SciPy-Dev mailing list