import from a string

Discussion in 'Python' started by iu2, Nov 3, 2009.

  1. iu2

    iu2 Guest

    Hi,

    Having a file called funcs.py, I would like to read it into a string,
    and then import from that string.
    That is instead of importing from the fie system, I wonder if it's
    possible to eval the text in the string and treat it as a module.

    For example

    with file('funcs.py') as f: txt = r.read()
    string_import(txt, 'funcs') # is string_import possible?

    to have now a module called funcs with the functions defined in
    funcs.py.

    Thanks
    iu2, Nov 3, 2009
    #1
    1. Advertising

  2. iu2 <israelu <at> elbit.co.il> writes:

    >
    > Hi,
    >
    > Having a file called funcs.py, I would like to read it into a string,
    > and then import from that string.
    > That is instead of importing from the fie system, I wonder if it's
    > possible to eval the text in the string and treat it as a module.
    >
    > For example
    >
    > with file('funcs.py') as f: txt = r.read()
    > string_import(txt, 'funcs') # is string_import possible?
    >
    > to have now a module called funcs with the functions defined in
    > funcs.py.


    You can do something like this:

    import types
    import sys

    mymodule = types.ModuleType("mymodule", "Optional Doc-String")

    with file('funcs.py') as f:
    txt = f.read()
    exec txt in globals(), mymodule.__dict__
    sys.modules['mymodule'] = mymodule


    Note that you shouldn't exec untrusted code.
    You might also look at the __import__ funciton, which can import by python path.
    You might also look at the imp module.

    Matt
    Matt McCredie, Nov 3, 2009
    #2
    1. Advertising

  3. iu2

    iu2 Guest

    On Nov 3, 7:49 pm, Matt McCredie <> wrote:
    > iu2 <israelu <at> elbit.co.il> writes:
    >
    >
    >
    > > Hi,

    >
    > > Having a file called funcs.py, I would like to read it into a string,
    > > and then import from that string.
    > > That is instead of importing from the fie system, I wonder if it's
    > > possible to eval the text in the string and treat it as a module.

    >
    > > For example

    >
    > > with file('funcs.py') as f: txt = r.read()
    > > string_import(txt, 'funcs')  # is string_import possible?

    >
    > > to have now a module called funcs with the functions defined in
    > > funcs.py.

    >
    > You can do something like this:
    >
    > import types
    > import sys
    >
    > mymodule = types.ModuleType("mymodule", "Optional Doc-String")
    >
    > with file('funcs.py') as f:
    >     txt = f.read()
    > exec txt in globals(), mymodule.__dict__
    > sys.modules['mymodule'] = mymodule
    >
    > Note that you shouldn't exec untrusted code.
    > You might also look at the __import__ funciton, which can import by python path.
    > You might also look at the imp module.
    >
    > Matt


    Thanks, it seems simpler than I thought.
    I don't fully understand , though, the exec statement, how it causes
    the string execute in the context of mymodule.
    iu2, Nov 3, 2009
    #3
  4. En Tue, 03 Nov 2009 17:36:08 -0300, iu2 <> escribió:
    > On Nov 3, 7:49 pm, Matt McCredie <> wrote:
    >> iu2 <israelu <at> elbit.co.il> writes:
    >>
    >> > Having a file called funcs.py, I would like to read it into a string,
    >> > and then import from that string.
    >> > That is instead of importing from the fie system, I wonder if it's
    >> > possible to eval the text in the string and treat it as a module.


    >> mymodule = types.ModuleType("mymodule", "Optional Doc-String")
    >> with file('funcs.py') as f:
    >> txt = f.read()
    >> exec txt in globals(), mymodule.__dict__
    >> sys.modules['mymodule'] = mymodule

    >
    > Thanks, it seems simpler than I thought.
    > I don't fully understand , though, the exec statement, how it causes
    > the string execute in the context of mymodule.


    Sometimes you don't even require a module, and this is simpler to
    understand. Suppose you have a string like this:

    txt = """
    def foo(x):
    print 'x=', x

    def bar(x):
    return x + x
    """

    you may execute it:

    py> namespace = {}
    py> exec txt in namespace

    The resulting namespace contains the foo and bar functions, and you may
    call them:

    py> namespace.keys()
    ['__builtins__', 'foo', 'bar']
    py> namespace['foo']('hello')
    x= hello

    exec just executes the string using the given globals dictionary as its
    global namespace. Whatever is present in the dictionary is visible in the
    executed code as global variables (none in this example). The global names
    that the code creates become entries in the dictionary. (foo and bar;
    __builtins__ is an implementation detail of CPython). You may supply
    separate globals and locals dictionaries.

    --
    Gabriel Genellina
    Gabriel Genellina, Nov 4, 2009
    #4
  5. iu2

    iu2 Guest

    On Nov 4, 3:10 am, "Gabriel Genellina" <> wrote:
    > En Tue, 03 Nov 2009 17:36:08 -0300, iu2 <> escribió:
    >
    >
    >
    >
    >
    > > On Nov 3, 7:49 pm, Matt McCredie <> wrote:
    > >> iu2 <israelu <at> elbit.co.il> writes:

    >
    > >> > Having a file called funcs.py, I would like to read it into a string,
    > >> > and then import from that string.
    > >> > That is instead of importing from the fie system, I wonder if it's
    > >> > possible to eval the text in the string and treat it as a module.
    > >> mymodule = types.ModuleType("mymodule", "Optional Doc-String")
    > >> with file('funcs.py') as f:
    > >>     txt = f.read()
    > >> exec txt in globals(), mymodule.__dict__
    > >> sys.modules['mymodule'] = mymodule

    >
    > > Thanks, it seems simpler than I thought.
    > > I don't fully understand , though, the exec statement, how it causes
    > > the string execute in the context of mymodule.

    >
    > Sometimes you don't even require a module, and this is simpler to  
    > understand. Suppose you have a string like this:
    >
    > txt = """
    > def foo(x):
    >    print 'x=', x
    >
    > def bar(x):
    >    return x + x
    > """
    >
    > you may execute it:
    >
    > py> namespace = {}
    > py> exec txt in namespace
    >
    > The resulting namespace contains the foo and bar functions, and you may  
    > call them:
    >
    > py> namespace.keys()
    > ['__builtins__', 'foo', 'bar']
    > py> namespace['foo']('hello')
    > x= hello
    >
    > exec just executes the string using the given globals dictionary as its  
    > global namespace. Whatever is present in the dictionary is visible in the  
    > executed code as global variables (none in this example). The global names  
    > that the code creates become entries in the dictionary. (foo and bar;  
    > __builtins__ is an implementation detail of CPython). You may supply  
    > separate globals and locals dictionaries.
    >
    > --
    > Gabriel Genellina- Hide quoted text -
    >
    > - Show quoted text -


    Thanks for the explanation.
    What happens if both global and local dictionaries are supplied: where
    are the newly created entities created? In the local dict?
    iu2, Nov 4, 2009
    #5
  6. En Wed, 04 Nov 2009 02:45:23 -0300, iu2 <> escribió:
    > On Nov 4, 3:10 am, "Gabriel Genellina" <> wrote:


    >> txt = """
    >> def foo(x):
    >> print 'x=', x
    >>
    >> def bar(x):
    >> return x + x
    >> """
    >>
    >> py> namespace = {}
    >> py> exec txt in namespace
    >> py> namespace.keys()
    >> ['__builtins__', 'foo', 'bar']
    >> py> namespace['foo']('hello')
    >> x= hello


    > What happens if both global and local dictionaries are supplied: where
    > are the newly created entities created? In the local dict?


    The amazing thing about Python is how easy is to experiment in the
    interpreter.
    Just see it by yourself!

    --
    Gabriel Genellina
    Gabriel Genellina, Nov 4, 2009
    #6
  7. iu2

    Terry Reedy Guest

    Gabriel Genellina wrote:
    > En Wed, 04 Nov 2009 02:45:23 -0300, iu2 <> escribió:
    >> On Nov 4, 3:10 am, "Gabriel Genellina" <> wrote:

    >
    >>> txt = """
    >>> def foo(x):
    >>> print 'x=', x
    >>>
    >>> def bar(x):
    >>> return x + x
    >>> """
    >>>
    >>> py> namespace = {}
    >>> py> exec txt in namespace
    >>> py> namespace.keys()
    >>> ['__builtins__', 'foo', 'bar']
    >>> py> namespace['foo']('hello')
    >>> x= hello

    >
    >> What happens if both global and local dictionaries are supplied: where
    >> are the newly created entities created? In the local dict?

    >
    > The amazing thing about Python is how easy is to experiment in the
    > interpreter.
    > Just see it by yourself!


    Hint: they are created in the same namespace they always are (ignoring
    nested functions and nonlocal namespaces). But I agree with Gabriel:
    just try it. n1,n2={},{}; exec....

    Terry Jan Reedy
    Terry Reedy, Nov 4, 2009
    #7
  8. iu2

    iu2 Guest

    On Nov 4, 8:51 pm, Terry Reedy <> wrote:
    > Gabriel Genellina wrote:
    > > En Wed, 04 Nov 2009 02:45:23 -0300, iu2 <> escribió:
    > >> On Nov 4, 3:10 am, "Gabriel Genellina" <> wrote:

    >
    > >>> txt = """
    > >>> def foo(x):
    > >>>    print 'x=', x

    >
    > >>> def bar(x):
    > >>>    return x + x
    > >>> """

    >
    > >>> py> namespace = {}
    > >>> py> exec txt in namespace
    > >>> py> namespace.keys()
    > >>> ['__builtins__', 'foo', 'bar']
    > >>> py> namespace['foo']('hello')
    > >>> x= hello

    >
    > >> What happens if both global and local dictionaries are supplied: where
    > >> are the newly created entities created? In the local dict?

    >
    > > The amazing thing about Python is how easy is to experiment in the
    > > interpreter.
    > > Just see it by yourself!

    >
    > Hint: they are created in the same namespace they always are (ignoring
    > nested functions and nonlocal namespaces). But I agree with Gabriel:
    > just try it. n1,n2={},{}; exec....
    >
    > Terry Jan Reedy- Hide quoted text -
    >
    > - Show quoted text -


    n2 :)
    iu2, Nov 5, 2009
    #8
    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:
    924
    Paul Opal
    Oct 11, 2004
  2. JPractitioner
    Replies:
    13
    Views:
    20,117
    Roedy Green
    Feb 24, 2006
  3. Vitali Gontsharuk
    Replies:
    2
    Views:
    552
    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:
    822
    Peter Hansen
    Jul 2, 2003
  5. Dennis
    Replies:
    2
    Views:
    488
    Dennis
    Aug 18, 2003
Loading...

Share This Page