function to do dynamic import?
bambam
david at asdf.asdf
Tue Sep 11 22:34:58 EDT 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