Problem with exec

Justus Schwabedal justus.schwabedal at gmx.de
Fri Mar 14 13:35:51 EDT 2008


On Mar 14, 2008, at 4:41 AM, alitosis at gmail.com wrote:

> On Mar 14, 9:47 am, Justus Schwabedal <justus.schwabe... at gmx.de>
> wrote:
> [snipped]
>> However when I do this:
>>
>> bash-3.2$ cat execBug2.py
>> #! /usr/bin/python
>> header="""
>> from scipy import randn
>> def f():
>>         return randn()
>> """
>> def g():
>>         exec header
>>         return f()
>> print "g() =",g()
>> bash-3.2$ ./execBug2.py
>> g() =
>> Traceback (most recent call last):
>>   File "./execBug2.py", line 10, in <module>
>>     print "g() =",g()
>>   File "./execBug2.py", line 9, in g
>>     return f()
>>   File "<string>", line 4, in f
>> NameError: global name 'randn' is not defined
>> bash-3.2$ ???
>>
>> I get this global name error. I can fix it with adding some line like
>> "global randn" but I don't want to do this. I want to do exactly  
>> what  I wrote: Import the function scipy.randn in the local  
>> namespace of the
>>
>> function "g" so that "return f()" makes sense. Can anybody help me  
>> out?
>> Yours Justus
>
> Maybe using an explicit namespace is good enough for your needs:
>
> #! /usr/bin/python
> header="""
> from scipy import randn
> def f():
>         return randn()
> """
> def g():
>         n = {}
>         exec header in n
>         return n['f']()
> print "g() =",g()
>
>
> (i don't understand the issues, but I can cut-and-paste with the best
> of them)
> -- 
> http://mail.python.org/mailman/listinfo/python-list

That's what I was looking for: It's probably even a faster solution  
than declaring all the imports global, isn't it?




More information about the Python-list mailing list