function to do dynamic import?

Discussion in 'Python' started by bambam, Sep 11, 2007.

  1. bambam

    bambam Guest

    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'>
    bambam, Sep 11, 2007
    #1
    1. Advertising

  2. bambam

    Guest

    On Sep 10, 10:52 pm, "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.




    (snipped)

    This was recently discussed:

    http://groups.google.com/group/comp.lang.python/msg/f6fcdf49710cb833

    --
    Hope this helps,
    Steven
    , Sep 11, 2007
    #2
    1. Advertising

  3. 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'>
    >
    >
    >
    J. Cliff Dyer, Sep 11, 2007
    #3
  4. bambam

    Steve Holden Guest

    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 -------------
    Steve Holden, Sep 11, 2007
    #4
  5. bambam

    bambam Guest

    <> wrote in message
    news:...
    > On Sep 10, 10:52 pm, "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.

    >
    >
    >
    > (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.
    bambam, Sep 12, 2007
    #5
  6. bambam

    bambam Guest

    "J. Cliff Dyer" <> wrote in message
    news:...
    > 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.
    bambam, Sep 12, 2007
    #6
  7. bambam

    bambam Guest

    "Steve Holden" <> wrote in message
    news:...
    > 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.
    bambam, Sep 12, 2007
    #7
  8. bambam

    Steve Holden Guest

    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 -------------
    Steve Holden, Sep 12, 2007
    #8
  9. bambam

    Peter Otten Guest

    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
    Peter Otten, Sep 12, 2007
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Paul Opal
    Replies:
    12
    Views:
    931
    Paul Opal
    Oct 11, 2004
  2. JPractitioner
    Replies:
    13
    Views:
    20,123
    Roedy Green
    Feb 24, 2006
  3. Vitali Gontsharuk
    Replies:
    2
    Views:
    555
    Vitali Gontsharuk
    Aug 25, 2005
  4. Artur M. Piwko

    import/from import question

    Artur M. Piwko, Jun 29, 2003, in forum: Python
    Replies:
    1
    Views:
    827
    Peter Hansen
    Jul 2, 2003
  5. Dennis
    Replies:
    2
    Views:
    490
    Dennis
    Aug 18, 2003
Loading...

Share This Page