我有一段代码存储在一个字符串中(用户在我的应用程序的文本框中编辑它(。在此代码中,有一个函数我想稍后使用 multiprocess.Pool
运行。但是,如果字符串中定义的函数是嵌套的,则它不起作用。
请注意,我使用的是multiprocess
,而不是标准multiprocessing
,它根本无法运行字符串中定义的函数。
请参阅以下代码片段中的注释以了解会发生什么情况。是否有任何解决方法可以在我的方案中使用?
funcs = """
def func(x):
return func_inner(x) + 1
def func_inner(x):
return x + 1
"""
import multiprocess
if __name__ == "__main__":
symbols = dict()
exec(funcs, symbols)
func = symbols["func"]
print(func(1)) # this is evaluated correctly as 3 so nesting functions work fine!
data = [1, 2, 3]
pool = multiprocess.Pool()
print(pool.map(func, data)) # this fails with NameError: name 'func_inner' is not defined!
我也在Windows和Linux上尝试过这个。我的multiprocess
版本是 0.70.5 和 Python 3.5。
似乎您只是缺少基于字符串的函数的compile()
:
funcs=compile("""
def func(x):
return func_inner(x) + 1
def func_inner(x):
return x + 1
""", '<string>', 'exec')
if __name__ == "__main__":
import multiprocess
symbols = dict()
exec(funcs, symbols)
func = symbols["func"]
print(func(1))
data = [1, 2, 3]
pool = multiprocess.Pool()
print(pool.map(func, data))
我的输出: [3, 4, 5]
更新:我的多进程版本是 - 0.70.4尝试以下脏修复,应该适合您:
import multiprocess
code_globals = {}
code_locals = {}
exec funcs in code_globals, code_locals
print code_locals
# {'func_inner': <function func_inner at 0x10aa607d0>, 'func': <function func at 0x10a97dde8>}
code_globals['func_inner']=code_locals['func_inner']
print code_globals['func_inner']
#<function func_inner at 0x10a1427d0>
func = code_locals['func']
print(func(1))
data = [1, 2, 3]
pool = multiprocess.Pool()
print(pool.map(func, data))