J'ai un morceau de code stocké dans une chaîne (l'utilisateur modifie cela dans une zone de texte dans mon application). Dans ce code, il existe une fonction que je veux exécuter plus tard en utilisant multiprocess.Pool
. Mais cela ne fonctionne pas si les fonctions définies dans la chaîne sont imbriquées.multiprocess ne fonctionne pas bien avec des fonctions imbriquées dans certains cas
Notez que j'utilise multiprocess
, plutôt que la norme multiprocessing
, qui ne serait pas capable d'exécuter les fonctions définies dans la chaîne.
Voir les commentaires dans l'extrait de code suivant pour voir ce qui se passe. Y a-t-il une solution de contournement que je pourrais utiliser dans mon scénario?
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!
J'ai également essayé sur Windows et Linux. Ma version multiprocess
est 0.70.5 et Python 3.5.
Je crains qu'il ne reste pour moi avec la même erreur que précédemment. –
Quelle version 'multiprocess' avez-vous? Je soupçonne que certaines choses se sont cassées dans les versions récentes. –
Je peux confirmer qu'après avoir ajouté 'code_globals ['func_inner'] = code_locals ['func_inner']', l'extrait de code fonctionne. Mais le problème est que dans la vie réelle cela ne peut pas être utilisé parce que je ne sais pas à l'avance, quelle fonction sera appelée par le pool, qui est imbriqué, etc. J'aurais besoin de quelque chose comme 'code_globals.update (code_locals)' tous les symboles locaux aux symboles globaux. Mais avec cette ligne, l'échantillon se casse à nouveau. –