dynamically importing a module and function

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • rkmr.em@gmail.com

    dynamically importing a module and function

    Hi
    I have a function data['function'], that I need to import from a file
    data['module'], in the directory data['cwd']

    If I do this from python interactive shell (linux fedora core 8) from
    dir /home/mark it works fine:

    cwd = data['cwd']
    os.chdir(cwd)
    print os.getcwd()
    module = __import__(data['module'])
    function = getattr(module, data['function'])

    But if I put this in a file /home/mark/work/common/funcq.py and run it
    from /home/mark, it throws me error like this.. how to fix this? it
    imports the module successfully, but it is not looking for subsequent
    modules in the os.getcwd()..

    /home/mark/work/proj1
    Traceback (most recent call last):
    File "/home/mark/work/common/funcq.py", line 60, in <module>
    if __name__ == '__main__':do()
    File "/home/mark/work/common/funcq.py", line 33, in do
    module = __import__(data['module'])
    File "/home/mark/app.py", line 5, in <module>
    import abcde
    ImportError: No module named abcde
  • John Machin

    #2
    Re: dynamically importing a module and function

    rkmr.em@gmail.c om wrote:
    Hi
    I have a function data['function'], that I need to import from a file
    data['module'], in the directory data['cwd']
    OT: Any good reason for using a dictionary instead of a class instance
    (data.functiom, data.module, etc)?
    >
    If I do this from python interactive shell (linux fedora core 8) from
    dir /home/mark it works fine:
    >
    cwd = data['cwd']
    os.chdir(cwd)
    print os.getcwd()
    module = __import__(data['module'])
    function = getattr(module, data['function'])
    >
    This is possibly due to python using what was the current working
    directory when it started up.

    An alternative (untested):

    saved = sys.path
    sys.path = data['cwd']
    module = __import__(data['module'])
    sys.path = saved

    Exception handling is left as an exercise for the reader.

    HTH,
    John

    Comment

    • rkmr.em@gmail.com

      #3
      Re: dynamically importing a module and function

      On Mon, Apr 21, 2008 at 3:39 PM, John Machin <sjmachin@lexic on.netwrote:
      rkmr.em@gmail.c om wrote:
      data['module'], in the directory data['cwd']
      OT: Any good reason for using a dictionary instead of a class instance
      (data.functiom, data.module, etc)?
      not really, i just wanted to stick to primitive python data types.

      If I do this from python interactive shell (linux fedora core 8) from
      dir /home/mark it works fine:

      cwd = data['cwd']
      os.chdir(cwd)
      print os.getcwd()
      module = __import__(data['module'])
      function = getattr(module, data['function'])
      saved = sys.path
      sys.path = data['cwd']
      module = __import__(data['module'])
      sys.path = saved
      now the module gets loaded, but i am not able to get the function from
      the module, though it works fine in the interactive-shell

      Traceback (most recent call last):
      File "/home/mark/work/common/funcq.py", line 62, in <module>
      if __name__ == '__main__':do()
      File "/home/mark/work/common/funcq.py", line 35, in do
      function = getattr(module, data['function'])
      AttributeError: 'module' object has no attribute 'new'


      this works in shell though..
      >>import os
      >>os.chdir('/home/mark/work/proj1')
      >>import sys
      >>sys.path.appe nd('/home/mark/work/proj1')
      >>module = __import__('app ')
      >>function = getattr(module, 'new')
      >>function(1)
      1

      Comment

      • John Machin

        #4
        Re: dynamically importing a module and function

        rkmr.em@gmail.c om wrote:
        On Mon, Apr 21, 2008 at 3:39 PM, John Machin <sjmachin@lexic on.netwrote:
        >rkmr.em@gmail.c om wrote:
        >>data['module'], in the directory data['cwd']
        > OT: Any good reason for using a dictionary instead of a class instance
        >(data.functiom , data.module, etc)?
        not really, i just wanted to stick to primitive python data types.
        >
        >
        >>If I do this from python interactive shell (linux fedora core 8) from
        >>dir /home/mark it works fine:
        >>>
        >> cwd = data['cwd']
        >> os.chdir(cwd)
        >> print os.getcwd()
        >> module = __import__(data['module'])
        >> function = getattr(module, data['function'])
        >>>
        >>>
        >
        > saved = sys.path
        > sys.path = data['cwd']
        > module = __import__(data['module'])
        > sys.path = saved
        >
        now the module gets loaded, but i am not able to get the function from
        the module, though it works fine in the interactive-shell
        >
        Traceback (most recent call last):
        File "/home/mark/work/common/funcq.py", line 62, in <module>
        if __name__ == '__main__':do()
        File "/home/mark/work/common/funcq.py", line 35, in do
        function = getattr(module, data['function'])
        AttributeError: 'module' object has no attribute 'new'
        >
        >
        this works in shell though..
        >>>import os
        >>>os.chdir('/home/mark/work/proj1')
        >>>import sys
        >>>sys.path.app end('/home/mark/work/proj1')
        >>>module = __import__('app ')
        >>>function = getattr(module, 'new')
        >>>function(1 )
        1
        It's not at all obvious that the "works in shell" code is the same as
        the code in your script.

        Consider the possibility that as a result of frantic experimentation you
        have multiple copies of app.* with varying contents lying around.

        Try this in your script so that you can see exactly what it is doing,
        instead of comparing it to a strawman:
        print "attempting to import", whatever
        module = __import__(what ever)
        print "got", module.__name__ , "from", os.path.abspath (module.__file_ _)
        print "module contents":, dir(module)

        Comment

        • rkmr.em@gmail.com

          #5
          Re: dynamically importing a module and function

          On Mon, Apr 21, 2008 at 4:47 PM, John Machin <sjmachin@lexic on.netwrote:
          saved = sys.path
          sys.path = data['cwd']
          module = __import__(data['module'])
          sys.path = saved
          >
          import os
          os.chdir('/home/mark/work/proj1')
          import sys
          sys.path.append ('/home/mark/work/proj1')
          module = __import__('app ')
          function = getattr(module, 'new')
          function(1)
          >

          >
          1
          >
          It's not at all obvious that the "works in shell" code is the same as the
          code in your script.
          >
          Consider the possibility that as a result of frantic experimentation you
          have multiple copies of app.* with varying contents lying around.
          thanks a lot!
          there was a file app.pyc lying around in the dir from which i was
          running the script...

          Comment

          Working...