How to pass variables between scripts?

Marcelo Ramos mramos at montevideo.com.uy
Tue May 16 13:51:00 EDT 2006


Gross, Dorit (SDRN) escribió:
>>> #! /usr/local/bin/python
>>> # test_exec.py
>>>
>>> import os, sys, glob
>>>
>>> fileList = glob.glob('/data/*.ZIP')
>>>
>>> for f in fileList:
>>> 	try: 
>>> 		globvars = {'infile' : f}
>>> 		locvars = {}
>>> 		execfile('/scripts/second.py', globvars(), locvars)
>>> 	except IOError:
>>> 		exit(0)
>>> 	print locvars
>>>
>>>
>>>       
>> You are calling the dictionary globvars as a function then the error. 
>> The fixed line is:
>>
>> execfile('/scripts/second.py', globvars, locvars)
>>
>>
>>
>> What you want is the function globals().
>> Try putting this line in second.py:
>>
>> print globals()['infile']
>>
>> Using the dictionary returned by globals() you can make second.py to 
>> read the contents of testexec.py's globvars dictionary.
>> locvars is populated with the local variables of second.py 
>> and that is 
>> what you want.
>>
>>     
>
> Marcelo, thank you! Passing the variables with dictonaries and function
> globals() works fine if no other functions are defined in 'second.py'. Now
> 'second.py' contains further functions and a "if __name__ = __main__"
> statement and in this case it seems that 'second.py' is not fully executed
> from 'test_exec.py'. For the sole purpose of testing, 'second.py' looks like
> this at the moment:
>
> #! /usr/local/bin/python
> # second.py
>
> import os, sys
>
> global zipfile
> print 'Read from globals: ' + globals()['infile']
> zipfile = globals()['infile']
> print 'Read from zipfile: ' + zipfile
>
> if __name__ == '__main__':
>
> 	print 'Hello'
> 	print globals()['infile']
> 	print zipfile
>
> 	
> Calling test_exec.py results into this output:
>
>  ./test_exec.py 
> Read from globals: /data/S0012230_0010.ZIP
> Read from zipfile: /data/S0012230_0010.ZIP
>
>
> It seems that the commands within the main are not executed when calling
> test_exec.py!?! Is there a way to make it running?
>
> Regards and thank you again, 
> Dorit
>
>
>   
If you print __name__ in second.py its value is '__builtin__', because 
of that your "main" doesn't execute.
Try adding this to test_exec.py before the execfile() call:

globvars[ '__name__' ] = '__main__'

It looks like a ad hoc fix but i couldn't find any doc about the change 
of __name__ to 'builtin' of a python script being run
from another with execfile().

Regards.

-- 
Marcelo Ramos
Fedora Core 5 | 2.6.16
Socio UYLUG Nro 125




More information about the Python-list mailing list