Re: function to do dynamic import?
Am Wed, 12 Sep 2007 11:54:51 +1000 schrieb bambam: def gim(): exec global gamel exec import gamel Unfortunately, does not have the desired effect. Steve. Both statements have to be part of a single exec: def gim(): modulename = gamel # determined at runtime exec global %s; import %s % (modulename, modulename) It may work, but it is still a bad idea to create global variables with a name not known until runtime. Peter -- http://mail.python.org/mailman/listinfo/python-list
function to do dynamic import?
import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. Steve. --- def gim(): ... exec import gamel ... gim() sys.modules[gamel] module 'gamel' from 'c:\gamel.pyc' gamel NameError: name 'gamel' is not defined exec import gamel gamel module 'gamel' from 'c:\gamel.pyc' -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
On Sep 10, 10:52 pm, bambam [EMAIL PROTECTED] wrote: import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. Steve. (snipped) This was recently discussed: http://groups.google.com/group/comp.lang.python/msg/f6fcdf49710cb833 -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
bambam wrote: import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. Steve. --- def gim(): ... exec import gamel ... All you have done in this function is bind the module to the name gamel within the scope of the function. As soon as the function exits, the module goes out of scope. If you want to use it externally, return the module. def: gim(): import gamel return gamel gim() This will have to change to gamel = gim() and the rest should work as expected. sys.modules[gamel] module 'gamel' from 'c:\gamel.pyc' gamel NameError: name 'gamel' is not defined exec import gamel gamel module 'gamel' from 'c:\gamel.pyc' -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
bambam wrote: import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. There's not much wrong with doing this, since it gives you the best of both worlds. But you mean sys.modules[filename], don't you? def gim(): ... exec import gamel ... gim() sys.modules[gamel] module 'gamel' from 'c:\gamel.pyc' gamel NameError: name 'gamel' is not defined exec import gamel gamel module 'gamel' from 'c:\gamel.pyc' Whoa there! There's a lot of difference between importing a module inside a function and executing an import statement inside a function. If you want to do dynamic imports then the __import__ function is what you need. Trying to use exec like that is a bad idea unless you clearly understand the relationship between the different namespaces involved. In fact, trying to use exec at all is a bad idea until you understand Python better, and even then it's not often a terrific idea. Think of exec more as a hack of last resort than the first tool to reach for to solve a problem. regards Steve -- Steve Holden+1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden --- Asciimercial -- Get on the web: Blog, lens and tag the Internet Many services currently offer free registration --- Thank You for Reading - -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
[EMAIL PROTECTED] wrote in message news:[EMAIL PROTECTED] On Sep 10, 10:52 pm, bambam [EMAIL PROTECTED] wrote: import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. Steve. (snipped) This was recently discussed: http://groups.google.com/group/comp.lang.python/msg/f6fcdf49710cb833 -- Hope this helps, Steven def gim(): exec global gamel exec import gamel Unfortunately, does not have the desired effect. Steve. -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
J. Cliff Dyer [EMAIL PROTECTED] wrote in message news:[EMAIL PROTECTED] bambam wrote: import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. Steve. --- def gim(): ... exec import gamel ... All you have done in this function is bind the module to the name gamel within the scope of the function. As soon as the function exits, the module goes out of scope. If you want to use it externally, return the module. def: gim(): import gamel return gamel gim() This will have to change to gamel = gim() and the rest should work as expected. sys.modules[gamel] module 'gamel' from 'c:\gamel.pyc' gamel NameError: name 'gamel' is not defined exec import gamel gamel module 'gamel' from 'c:\gamel.pyc' def: gim(): import gamel return gamel Unfortunately, it needs to do dynamic import: I can't list all of the possible import modules because they are unknown until runtime. Steve. -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
Steve Holden [EMAIL PROTECTED] wrote in message news:[EMAIL PROTECTED] bambam wrote: import works in the main section of the module, but does not work as I hoped when run inside a function. That is, the modules import correctly, but are not visible to the enclosing (global) scope. Questions: (1) Where can I read an explanation of this? (2) Is there a work around? BTW, sys.modules(filename) shows that the module is loaded, I just don't know how to use it when loaded that way. Also, if I import again at the global scope, the module name becomes available. There's not much wrong with doing this, since it gives you the best of both worlds. But you mean sys.modules[filename], don't you? def gim(): ... exec import gamel ... gim() sys.modules[gamel] module 'gamel' from 'c:\gamel.pyc' gamel NameError: name 'gamel' is not defined exec import gamel gamel module 'gamel' from 'c:\gamel.pyc' Whoa there! There's a lot of difference between importing a module inside a function and executing an import statement inside a function. If you want to do dynamic imports then the __import__ function is what you need. Trying to use exec like that is a bad idea unless you clearly understand the relationship between the different namespaces involved. In fact, trying to use exec at all is a bad idea until you understand Python better, and even then it's not often a terrific idea. Think of exec more as a hack of last resort than the first tool to reach for to solve a problem. regards Steve -- Steve Holden+1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden --- Asciimercial -- Get on the web: Blog, lens and tag the Internet Many services currently offer free registration --- Thank You for Reading - Yes, sys.modules[filename], unfortunately, same mistake made already 4 or 5 times before I typed this, and still hadn't learned...many years working in an environment where the distinction was not important. Sorry. def gim(self): for gamel in self.gamel_list: __import__(gamel['file']) Works as hoped for. I did a web search for 'dynamic import' and the only examples I found used exec. Thanks Steve. -- http://mail.python.org/mailman/listinfo/python-list
Re: function to do dynamic import?
bambam wrote: [...] def gim(self): for gamel in self.gamel_list: __import__(gamel['file']) Works as hoped for. I did a web search for 'dynamic import' and the only examples I found used exec. Thanks Cool. You're getting there! regards Steve -- Steve Holden+1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden --- Asciimercial -- Get on the web: Blog, lens and tag the Internet Many services currently offer free registration --- Thank You for Reading - -- http://mail.python.org/mailman/listinfo/python-list