embedding python in python

Jeff Shannon jeff at ccvcorp.com
Thu Sep 30 20:17:06 EDT 2004


Maurice LING wrote:

> Hi,
>
> Sorry, I have another problem here. Given this snipplet,
>
> >>> def b(s):
> ...     exec(s)
> ...     exec('print "x= " + str(x)')
> ...
> >>> b('x = 10')
> x= 10
> >>>
> >>> print x
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
> NameError: name 'x' is not defined
> >>>
>
> Clearly, all the objects that were declared using exec() in function b 
> went out of scope, is there anyway to prevent this from happening?


 >>> myglobals = {}
 >>> mylocals = {}
 >>> exec "b = 1 + 2" in myglobals, mylocals
 >>> mylocals
{'b': 3}
 >>> exec "c = b * 2" in myglobals, mylocals
 >>> mylocals
{'c': 6, 'b': 3}
 >>> >>>

The exec statement can take an optional pair of dictionaries that it 
uses as the global and local namespaces to execute the given code in.  
This is *much* preferable to a bare exec for several reasons, one of 
them being exactly your issue, and another being safety -- since you 
must explicitly include any names that you want exec to use, it makes 
exec rather less likely to unintentionally stomp all over your namespace 
(or for malicious code to do certain types of harm).

Jeff Shannon
Technician/Programmer
Credit International




More information about the Python-list mailing list