Problem with exec

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Justus Schwabedal

    Problem with exec

    I'm trying to parallise with python. Specifically I'm sending code to
    the processes and let them exec this code (in ascii form). However I
    ran into a problem with Namespaces (I think) which I do not understand.

    Here's what I do first:
    ---------------------------------------
    bash-3.2$ cat execBug.py
    #! /usr/bin/python
    header="""
    from scipy import randn
    def f():
    return randn()
    """
    exec header
    print "f() =",f()

    bash-3.2$ ./execBug.py
    f() = 0.633306324515


    it est: it works.
    However when I do this:

    bash-3.2$ cat execBug2.py
    #! /usr/bin/python
    header="""
    from scipy import randn
    def f():
    return randn()
    """
    def g():
    exec header
    return f()
    print "g() =",g()
    bash-3.2$ ./execBug2.py
    g() =
    Traceback (most recent call last):
    File "./execBug2.py", line 10, in <module>
    print "g() =",g()
    File "./execBug2.py", line 9, in g
    return f()
    File "<string>", line 4, in f
    NameError: global name 'randn' is not defined
    bash-3.2$ ???

    I get this global name error. I can fix it with adding some line like
    "global randn" but I don't want to do this. I want to do exactly what
    I wrote: Import the function scipy.randn in the local namespace of the
    function "g" so that "return f()" makes sense. Can anybody help me out?
    Yours Justus
  • alitosis@gmail.com

    #2
    Re: Problem with exec

    On Mar 14, 9:47 am, Justus Schwabedal <justus.schwabe ...@gmx.de>
    wrote:
    [snipped]
    However when I do this:
    >
    bash-3.2$ cat execBug2.py
    #! /usr/bin/python
    header="""
    from scipy import randn
    def f():
    return randn()
    """
    def g():
    exec header
    return f()
    print "g() =",g()
    bash-3.2$ ./execBug2.py
    g() =
    Traceback (most recent call last):
    File "./execBug2.py", line 10, in <module>
    print "g() =",g()
    File "./execBug2.py", line 9, in g
    return f()
    File "<string>", line 4, in f
    NameError: global name 'randn' is not defined
    bash-3.2$ ???
    >
    I get this global name error. I can fix it with adding some line like
    "global randn" but I don't want to do this. I want to do exactly what I wrote: Import the function scipy.randn in the local namespace of the
    >
    function "g" so that "return f()" makes sense. Can anybody help me out?
    Yours Justus
    Maybe using an explicit namespace is good enough for your needs:

    #! /usr/bin/python
    header="""
    from scipy import randn
    def f():
    return randn()
    """
    def g():
    n = {}
    exec header in n
    return n['f']()
    print "g() =",g()


    (i don't understand the issues, but I can cut-and-paste with the best
    of them)

    Comment

    • Justus Schwabedal

      #3
      Re: Problem with exec


      On Mar 14, 2008, at 4:41 AM, alitosis@gmail. com wrote:
      On Mar 14, 9:47 am, Justus Schwabedal <justus.schwabe ...@gmx.de>
      wrote:
      [snipped]
      >However when I do this:
      >>
      >bash-3.2$ cat execBug2.py
      >#! /usr/bin/python
      >header="""
      >from scipy import randn
      >def f():
      > return randn()
      >"""
      >def g():
      > exec header
      > return f()
      >print "g() =",g()
      >bash-3.2$ ./execBug2.py
      >g() =
      >Traceback (most recent call last):
      > File "./execBug2.py", line 10, in <module>
      > print "g() =",g()
      > File "./execBug2.py", line 9, in g
      > return f()
      > File "<string>", line 4, in f
      >NameError: global name 'randn' is not defined
      >bash-3.2$ ???
      >>
      >I get this global name error. I can fix it with adding some line like
      >"global randn" but I don't want to do this. I want to do exactly
      >what I wrote: Import the function scipy.randn in the local
      >namespace of the
      >>
      >function "g" so that "return f()" makes sense. Can anybody help me
      >out?
      >Yours Justus
      >
      Maybe using an explicit namespace is good enough for your needs:
      >
      #! /usr/bin/python
      header="""
      from scipy import randn
      def f():
      return randn()
      """
      def g():
      n = {}
      exec header in n
      return n['f']()
      print "g() =",g()
      >
      >
      (i don't understand the issues, but I can cut-and-paste with the best
      of them)
      --
      http://mail.python.org/mailman/listinfo/python-list
      That's what I was looking for: It's probably even a faster solution
      than declaring all the imports global, isn't it?

      Comment

      Working...