Encontré varias opciones para hacer esto, antes de que Antti publicara his answer que Python 2 admite Python 3 exec function syntax.
The first expression may also be a tuple of length 2 or 3. In this case, the optional parts must be omitted. The form exec(expr, globals)
is equivalent to exec expr in globals
, while the form exec(expr, globals, locals)
is equivalent to exec expr in globals, locals
. The tuple form of exec provides compatibility with Python 3, where exec is a function rather than a statement.
Si no desea utilizar eso por alguna razón, aquí están todas las otras opciones que encontré.
importación Talones
Usted puede declarar dos talones de importación diferentes e importación lo que se trabaja con el intérprete actual. Esto se basa en lo que vi en el código fuente de PyDev.
Esto es lo que se pone en el módulo principal:
try:
from exec_python2 import exec_code #@UnusedImport
except:
from exec_python3 import exec_code #@Reimport
Esto es lo que pone en exec_python2.py
:
def exec_code(source, global_vars, local_vars):
exec source in global_vars, local_vars
Esto es lo que pone en exec_python3.py
:
def exec_code(source, global_vars, local_vars):
exec(source, global_vars, local_vars)
Exec en Eval
Ned Batchelder publicó una técnica que envuelve la declaración exec
en una llamada a eval
por lo que no causará un error de sintaxis en Python 3. Es inteligente, pero no está claro.
# Exec is a statement in Py2, a function in Py3
if sys.hexversion > 0x03000000:
def exec_function(source, filename, global_map):
"""A wrapper around exec()."""
exec(compile(source, filename, "exec"), global_map)
else:
# OK, this is pretty gross. In Py2, exec was a statement, but that will
# be a syntax error if we try to put it in a Py3 file, even if it isn't
# executed. So hide it inside an evaluated string literal instead.
eval(compile("""\
def exec_function(source, filename, global_map):
exec compile(source, filename, "exec") in global_map
""",
"<exec_function>", "exec"
))
Seis paquete
El six package es una biblioteca de compatibilidad para escribir código que se ejecutará bajo tanto Python 2 y Python 3. Tiene una exec_()
function que se traduce en ambas versiones. No lo he intentado.
leído el libro: http://python3porting.com/differences.html#exec –
@LennartRegebro esa fuente es equivocado acerca de ' exec' –
Huh, estoy bastante seguro de que lo intenté. Lo intentaré de nuevo. –