homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: NameError Issue in Multiprocessing
Type: Stage:
Components: None Versions: Python 2.6
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: frobnitzem, mark.dickinson
Priority: normal Keywords:

Created on 2012年05月01日 18:56 by frobnitzem, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Messages (2)
msg159764 - (view) Author: David M. Rogers (frobnitzem) Date: 2012年05月01日 18:56
Python Devs,
 There is an issue relating to variable lookup using exec from within multiprocessing's fork()-ed process. I'm attempting to use the forked process as a generic remote python shell, but exec is unable to reach variables from within functions. This issue makes it impossible to define a function which uses un-passed variables defined in the remote process.
 The simplest way to reproduce the error is:
--- err.py ---
from multiprocessing import Process, Pipe
def run_remote(con, name):
 my_name = name
 for i in range(2):
 code = con.recv()
 exec code
me, he = Pipe()
p = Process(target=run_remote,
 args=(he, "Sono Inglese de Gerrards Cross."))
p.start()
me.send("print my_name") # works
me.send("""
def show_name():
 print my_name
show_name() # doesn't work
""")
--- end err.py ---
This program prints:
$ python2.6 err.py
Sono Inglese de Gerrards Cross.
Process Process-1:
Traceback (most recent call last):
 File "/sw/lib/python2.6/multiprocessing/process.py", line 232, in _bootstrap
 self.run()
 File "/sw/lib/python2.6/multiprocessing/process.py", line 88, in run
 self._target(*self._args, **self._kwargs)
 File "err.py", line 7, in run_remote
 exec code
 File "<string>", line 4, in <module>
 File "<string>", line 3, in show_name
NameError: global name 'my_name' is not defined
I'm using Mac OSX (10.6.8) and
Python 2.6.5 (r265:79063, Sep 23 2010, 14:05:02) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
The issue (with the same traceback) also occurs for:
Python 2.7 (r27:82500, Sep 29 2010, 15:34:46) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Using exactly the same set of exec calls locally results in the correct behavior.
--- noerr.py ---
my_name = "Sono Inglese de Gerrards Cross."
exec "print my_name"
exec """
def show_name():
 print my_name
show_name()
"""
--- end noerr.py ---
msg159766 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2012年05月01日 19:16
Thanks for the report.
This is expected behaviour. It isn't actually anything to do with multiprocessing; it's to do with invoking exec from within a function scope. You can see the same effect with code like this:
code = """\
def show_name():
 print my_name
show_name()
"""
def run():
 my_name = "me"
 exec code
run()
See
http://docs.python.org/reference/executionmodel.html#interaction-with-dynamic-features
for more explanation.
History
Date User Action Args
2022年04月11日 14:57:29adminsetgithub: 58909
2012年05月01日 19:16:35mark.dickinsonsetstatus: open -> closed

nosy: + mark.dickinson
messages: + msg159766

resolution: not a bug
2012年05月01日 18:56:30frobnitzemcreate

AltStyle によって変換されたページ (->オリジナル) /