function to do dynamic import?

bambam david at asdf.asdf
Wed Sep 12 04:34:58 CEST 2007


"Steve Holden" <steve at holdenweb.com> wrote in message 
news:mailman.378.1189513496.2658.python-list at python.org...
> 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. 





More information about the Python-list mailing list