9 votos

¿Borrar variables de la consola de Python de forma programática?

A menudo utilizo el Consola Python para ejecutar algunas líneas de código y también uso algunas imprime para comprobar la validez de los resultados.

Si ejecuto este código de ejemplo

a = 2
b = 4
res = a + b
print res

imprimirá el valor del res en la consola de Python. Sin embargo, si luego cierro la pestaña script, el res la variable sigue ahí. Esto significa que, si escribo print res en la consola de Python, seguirá devolviendo el último valor almacenado.

Sé que puedo escribir a máquina:

del res

de la consola de Python para borrarlo. De hecho, si luego escribo print res me sale:

NameError: name 'res' is not defined

como se esperaba, pero esto es útil sólo cuando se trata de una o dos variables y si recuerdo los nombres de estas variables.


Después de algunas búsquedas, encontré estas preguntas:

¿Cómo borrar la consola de Python en QGIS?

Borrar la consola de Python en QGIS mediante un comando de Python

pero sus respuestas sólo explican cómo claro la consola de Python y no cómo borrar las variables.


¿Existe una forma programática para borrar todas las variables almacenadas durante la sesión actual de QGIS?

9voto

bretddog Puntos 210

Además de la respuesta de @bcollins, si quieres cambiar las variables que has definido dentro de la consola de python de QGIS puedes probar este enfoque:

Defina una variable que contenga todas las variables antes de empezar a programar:

my_dir = dir()

Haz tu magia con GIS, por ejemplo:

 my_variable = 42
 my_other_variable = "foo"

Entonces haz algo como esto:

for varis in dir():
   if varis not in my_dir and varis != "my_dir":
        print varis 
        exec("%s = None" % str(varis)) # set them to None 

De esta manera se obtienen todas las variables que son NO en my_dir y no elimine ninguna otra variable que haya sido añadida por QGIS.

Actualización: Con la sugerencia de @jon_two intento combinar el método de @bcollins y el mío. Esto sería algo así como:

## after you finished your magic
my_new_dir = list(dir())
for varis in my_new_dir:
   if varis not in my_dir and varis != "my_dir":
        del locals()[varis]

0 votos

¿Cuál debería ser el resultado esperado?

0 votos

El resultado esperado sería, que al teclear por ejemplo 'mi_variable', que devolviera None, pero el nombre de la variable seguiría existiendo. Creo que su objetivo es liberar espacio hd. si no se puede tratar de @bcollins enfoque con 'del locales()[v]'

0 votos

Creo que una combinación de este y @bcollins enfoque sería el mejor, aunque no se olvide de tomar una copia de locales / directorio de lo contrario se mantendrá la actualización a medida que el ciclo a través de él. my_dir = list(dir()) o my_locals = dict(locals()) .

6voto

fev16 Puntos 26

Hay un par de funciones incorporadas que deberías considerar para esto.

dir() will gives you the list of in scope variables
globals() will give you a dictionary of global variables
locals() will give you a dictionary of local variables

pero puede tener problemas porque podría borrar inadvertidamente algunas variables que QGIS establece. Así que algo como esto podría hacerte empezar:

>>> my_var_res = 4
>>> my_vars = [v for v in locals().keys() if v.startswith('my_var')]
['my_var_res']
>>> for v in my_vars:
        del locals()[v]

No estoy afirmando que esto sea algo bueno, sólo que es posible

0 votos

Gracias por la respuesta, pero probablemente esto no solucione el problema. De esta manera, necesito saber el nombre de la variable para utilizar startswith() y no parece una forma programática de resolver el problema. ¿O me equivoco?

6voto

Mue Puntos 2469

Un método que utilicé hace tiempo fue comenzar cada nombre de variable con un guión bajo ("_"). Como no hay otras variables que empiecen con un solo guión bajo (sólo con doble), puedes buscar todas estas variables y eliminarlas en consecuencia:

# Define user variables
_foo1 = "Hello world"
_foo2 = "bar"
_foo3 = {"1":"a", "2":"b"}
_foo4 = "1+1"

# Create list containing user variables
my_vars = []
for var in dir():
    if var.startswith('_') and not var.startswith('__'):
        my_vars.append(var)

# Delete specific user variable
for x in my_vars:
    if '_foo1' in x:
        del globals()[x]

# Delete all user variables
for x in my_vars:
    del globals()[x]

1 votos

Gracias Joseph, pero creo que la solución de @LaughU podría ser más versátil porque evita el uso del guión bajo para todas las variables involucradas.

1 votos

@mgri - De nada y estoy de acuerdo, me resultaba bastante pesado tener que añadir constantemente un guión bajo para cada variable. Afortunadamente, no tuve que trabajar con esto por mucho tiempo :)

0 votos

Como puedes imaginar, mi pregunta era más una curiosidad que una necesidad real =)

2voto

BWW Puntos 302

Puede probar lo siguiente para los globales

Al inicio de la sesión, guarde las claves de su contexto global, por ejemplo

myglobals = set(globals().keys())

Más tarde, para saber lo que hay que limpiar, obtendrá el difference del método set utilizando

set(globals().keys()).difference(myglobals)

Para eliminar todas las variables globales, excepto myglobals para mantener la información de estado en su consola PyQGIS, haga lo siguiente

for g in set(globals().keys()).difference(myglobals):
    if g != 'myglobals':
        del globals()[g]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X