2010-03-23 74 views
26

Hay un fragmento de código que me gustaría copiar y pegar en mi intérprete de Python. Desafortunadamente, debido a la sensibilidad de Python al espacio en blanco, no es sencillo copiarlo y pegarlo de una manera que tenga sentido. (Creo que el espacio en blanco se destroza) ¿Hay alguna manera mejor? Tal vez puedo cargar el fragmento de un archivo.Copiar y pegar código en el intérprete de Python

Esto es solo un pequeño ejemplo, pero si hay un montón de código me gustaría evitar escribir todo desde la definición de la función o copiar y pegar línea por línea.

class bcolors: 
    HEADER = '\033[95m' 
    OKBLUE = '\033[94m' 
    OKGREEN = '\033[92m' 
    WARNING = '\033[93m' 
    FAIL = '\033[91m' 
    ENDC = '\033[0m' 

    def disable(self): 
     self.HEADER = '' # I think stuff gets mangled because of the extra level of indentation 
     self.OKBLUE = '' 
     self.OKGREEN = '' 
     self.WARNING = '' 
     self.FAIL = '' 
     self.ENDC = '' 
+0

Use un editor decente (me refiero a Emacs) y no tendrá que copiar/pegar. – tripleee

+3

¿Cómo se puede usar Emacs para copiar pegar de python.org a la terminal? –

+0

micropython tiene un modo de pegado especial, accesible presionando 'ctrl-E' –

Respuesta

8

Puede llamar a execfile (nombre de archivo). Más o menos lo mismo que importar un módulo, excepto que omite la parte de administración del módulo y no requiere que agregue una carpeta a sys.path.

EDITAR: Para resolver la pregunta original: el código de copiar y pegar puede ejecutarse llamando a exec (cadena de texto).

+10

¿cómo responde esto a la pregunta "¿cómo puedo pegar el código de Python?" –

+1

Está en lo cierto al decir que realmente no es así, pero prefiero esta solución porque no requiere que elija un shell específico o use un IDE específico. Las otras soluciones también son excelentes, pero acepté la que es más general. – wp123

+0

@Bryan Oakley: Tiene razón, execfile (nombre de archivo) no se puede usar para eso. exec (cadena de código) puede, sin embargo. –

5

Puede importar el archivo en el intérprete de Python. Esto cargará la clase y le permitirá ejecutar el código.

Por ejemplo, crea un archivo llamado "bgcolors.py" y copia y pega el código dentro. Luego, utilizando el intérprete de Python, simplemente escriba "import bgcolors" y debería poder ejecutarlo.

Puede leer más aquí:

http://docs.python.org/tutorial/modules.html

+0

Un segundo' import bgcolors' en la misma sesión no hará nada porque la importación "sabe" bgcolors ya se ha importado. – msw

+1

En lugar de importarlo explícitamente en el shell, llame a python de la siguiente manera: 'python -m bgcolors.py' y se le presentará un entorno donde ese módulo ya está cargado. – vezult

+0

Creo que la opción -m solo funciona para el archivo en sys.path. Pero mi script no está en la biblioteca estándar. – wp123

5

Usted puede utilizar IPython que es mucho mejor repl pitón. Tiene el comando para obtener entrada desde external editor usando el comando% edit.

+0

Me gusta esta solución porque no requiere el uso de un IDE diferente. – wp123

2

La interfaz IDLE se esfuerza por preservar la sangría correcta del texto pegado.

3

Dreampie le permite copiar y pegar el código con la sangría adecuada.

24

Por lo general, puede copiar y pegar de forma fácil y segura con IPython, a través de los comandos %cpaste y %paste. Esto es muy útil para probar código que copia de páginas web, por ejemplo, o de su editor. IPython también tiene un comando %run que ejecuta un programa y te deja en un shell de Python con todas las variables que se definieron en el programa, para que puedas jugar con ellos.

Con el fin de obtener ayuda sobre estas funciones: %cpaste?, etc.

+0

JetBrains PyCharm también es compatible con esto. – Andrew

+1

¡Esta es la mejor respuesta! :) –

+0

En ** 'Ipython 5' ** simplemente pegue el código. Lea mi respuesta [aquí] (http: // stackoverflow.com/a/38419584/2248627) – Levon

0

he tenido este problema recientemente y en última instancia, sólo necesitaba para cambiar la configuración de tabulaciones en espacios hendidura de mi editor. (Estaba ejecutando el intérprete utilizando el terminal OSX.) Una vez que hice esto, copie & pegar funcionó bien.

3

Puede simplemente convertir todas las pestañas en espacios y eliminar TODAS líneas vacías. Así podrá pegar cualquier código en la consola de Python (por ejemplo: python2.6)

1

Hay una llamada de método incorporada "región de sangría & región de dedent" y solo puede usarla. Después de pegar una gran cantidad de código a la vez, puede seleccionarlos todos y ajustar el espacio en blanco.

1

Mi respuesta es específicamente acerca de copiar y pegar en el shell estándar de python (solo probado en Linux).

Dependiendo de dónde proviene el código y cómo está formateado originalmente , los espacios en blanco pueden o no ser importantes. En particular, acerca de su fragmento de ejemplo, copiado y pegado de la sección con formato de código de SO, no importa (suponiendo que el código esté adecuadamente sangrado para ser ejecutable).

La línea vacía, sin embargo, no causar problemas en el intérprete de Python estándar porque normalmente es la cáscara-s de-guión cmd. En el caso de su fragmento de la línea en blanco que precede a la definición disable() función finaliza/sale de la definición de clase antes de tiempo, por lo que cuando la línea disable() definición proviene de un error muesca se detecta:

>>> class bcolors: 
...  HEADER = '\033[95m' 
...  OKBLUE = '\033[94m' 
...  OKGREEN = '\033[92m' 
...  WARNING = '\033[93m' 
...  FAIL = '\033[91m' 
...  ENDC = '\033[0m' 
... 
>>> def disable(self): 
    File "<stdin>", line 1 
    def disable(self): 
    ^
IndentationError: unexpected indent 
>>> 

lo que sólo tiene que prestar atención a los líneas vacías. El fragmento necesita solo 2 operaciones de copiar y pegar de varias líneas para evitar esa línea vacía.

La única otra cosa que necesitaba - para copiar y pegar solo secciones de código ya sangrado (digamos funciones de dentro de clases) - un nivel adicional de sangría para no tener que volver a hacer la sangría del código copiado. Para que una de las principales if 1: línea antes de pegar el fragmento y un Introduzca (es decir, línea de vacío) después de hacer el truco:

>>> if 1: 
...  def disable(self): 
...   self.HEADER = '' # I think stuff gets mangled because of the extra level of indentation 
...   self.OKBLUE = '' 
...   self.OKGREEN = '' 
...   self.WARNING = '' 
...   self.FAIL = '' 
...   self.ENDC = '' 
... 
>>> 
+0

Una alternativa al uso de dos operaciones de copiar y pegar es simplemente asegurarse de que la línea "en blanco" tenga la misma cantidad que el resto del código. Y para evitar el uso de 'if 1:' hay algunas alternativas: si su editor tiene una selección de bloque visual (en lugar de selección de línea), úselo. O bien, seleccione las líneas que desea copiar y anule la sangría antes de copiarlas. – Jeff

0

Para aquellos que tienen problemas de copiar/pegar usando ctrl-c & ctrl-v en el Python shell intérprete en Windows en el que simplemente muestra:

>>> ^V 

simplemente haga clic del ratón, la barra de título de la ventana aplicación y se selecciona por defecto o propiedades, a continuación, desea elimina la marca de Use legacy console (requires relaunch) asegurando que ahora Enable Ctrl key shortcuts está marcada, el n cierre y vuelva a abrir la ventana de la consola del intérprete de Python.

Cuestiones relacionadas