2010-03-23 57 views
26

C'è uno snippet di codice che vorrei copiare e incollare nel mio interprete Python. Sfortunatamente a causa della sensibilità di Python allo spazio bianco non è semplice copiarlo e incollarlo in un modo che abbia senso. (Penso che lo spazio bianco venga stravolto) Esiste un modo migliore? Forse posso caricare lo snippet da un file.Copia e incolla il codice nell'interprete Python

Questo è solo un piccolo esempio, ma se c'è molto codice vorrei evitare di digitare tutto dalla definizione della funzione o copiare e incollare riga per riga.

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

Utilizzare un editor decente (con cui intendo Emacs) e non sarà necessario copiare/incollare. – tripleee

+3

In che modo l'uso di Emacs può aiutare a copiare l'incisione da python.org a terminale? –

+0

micropython ha una modalità di incolla speciale, accessibile premendo 'ctrl-E' –

risposta

8

È possibile chiamare execfile (nome file). Più o meno come importare un modulo, tranne che salta la parte di amministrazione del modulo e non richiede di aggiungere una cartella a sys.path.

MODIFICA: Per rispondere alla domanda iniziale: il codice copia-incollato può essere eseguito chiamando exec (codestring).

+10

come risponde la domanda "come posso incollare il codice Python?" –

+1

Hai ragione che non è così, ma preferisco questa soluzione perché non richiede di scegliere una shell specifica o utilizzare un IDE specifico. Anche le altre soluzioni sono eccellenti, ma ho accettato quella più generale. – wp123

+0

@Bryan Oakley: hai ragione, execfile (nomefile) non può essere usato per quello. exec (codestring) può, però. –

5

Si può semplicemente importare il file in l'interprete Python. Questo caricherà la classe e ti permetterà di eseguire il codice.

Ad esempio, creare un file denominato "bgcolors.py" e copiare e incollare il codice all'interno. Quindi, usando l'interprete python, devi solo digitare "import bgcolors" e dovresti essere in grado di eseguirlo.

Si può leggere di più qui:

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

+0

Un secondo' import bgcolors' nella stessa sessione non farà nulla perché l'importazione "sa" bgcolors è già stata importata. – msw

+1

Invece di importarlo esplicitamente nella shell, chiama python in questo modo: 'python -m bgcolors.py' e ti verrà presentato un ambiente in cui quel modulo è già caricato. – vezult

+0

Penso che l'opzione -m funzioni solo per file in sys.path. Ma il mio script non è nella libreria standard. – wp123

5

È possibile utilizzare IPython che è molto meglio repl pitone. Ha il comando per ottenere input da external editor usando il comando% edit.

+0

Mi piace questa soluzione perché non richiede l'utilizzo di un IDE diverso. – wp123

2

L'interfaccia IDLE fa uno sforzo per mantenere il rientro corretto del testo incollato.

3

Dreampie consente di copiare e incollare il codice con il rientro corretto.

24

Si può di solito facilmente e sicuro fare copia-incolla con IPython, tramite i comandi %cpaste e %paste. Questo è molto utile per testare il codice che copi dalle pagine web, per esempio, o dal tuo editor. IPython ha anche un comando %run che esegue un programma e ti lascia in una shell Python con tutte le variabili definite nel programma, in modo che tu possa giocare con loro.

Al fine di ottenere aiuto su queste funzioni: %cpaste?, ecc

+0

JetBrains PyCharm supporta anche questo! – Andrew

+1

Questa è la migliore risposta! :) –

+0

In ** 'Ipython 5' ** è sufficiente incollare il codice. Leggi la mia risposta [qui] (http: // StackOverflow.it/a/38419584/2248627) – Levon

0

Ho avuto questo problema di recente e in ultima analisi, solo bisogno di modificare l'impostazione da tabulazioni in spazi indentazione del mio editore. (Stavo eseguendo l'interprete usando il terminale OSX.) Una volta fatto questo, copiare la copia & funzionava bene.

3

È sufficiente convertire tutte le schede in spazi e rimuovere TUTTE le linee vuote. Quindi sarà possibile incollare qualsiasi codice alla console python (ad es .: python2.6)

1

C'è una chiamata di metodo integrata "regione di indentazione & regione di deduzione" e si può semplicemente usarla. Dopo aver incollato un sacco di codice contemporaneamente, è possibile selezionarli tutti e regolare gli spazi bianchi.

1

La mia risposta riguarda specificamente il copia-incolla nella shell standard di Python (testata solo su linux).

A seconda di dove il codice viene e come è originariamente formattato gli spazi può o non può importa. In particolare riguardo allo snippet di esempio - copia-incollato dalla sezione formattata in codice di SO - non ha importanza (assumendo che il codice sia correttamente rientrato per essere eseguibile).

La linea vuota, tuttavia, provoca problemi standard di Python perché normalmente è il guscio-s-de trattino cmd. Nel caso del frammento la riga vuota che precede la definizione disable() funzione termina/esce la definizione della classe prematuramente, in modo che quando la linea disable() definizione deriva un errore rientranza viene rilevato:

>>> 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 
>>> 

quindi basta prestare attenzione a coloro linee vuote. Il tuo frammento di codice richiede solo 2 op multi-riga copia-incolla per aggirare quella linea vuota.

L'unica altra cosa di cui avevo bisogno - per copiare solo sezioni di codice già indentato (ad esempio funzioni da classi interne) - un ulteriore livello di rientro per non aver bisogno di rifare il rientro del codice copiato. Per questo uno dei principali if 1: linea prima di incollare il frammento ed un Enter (cioè linea vuota) dopo il trucco:

>>> 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

Un'alternativa all'utilizzo di due operazioni di copia-incolla è semplicemente assicurarsi che la riga "vuota" sia rientrata nella stessa quantità del resto del codice. E per evitare di usare 'if 1:' ci sono alcune alternative: se il tuo editor ha una selezione di blocchi visivi (piuttosto che selezione riga), usa quello. Oppure, seleziona le linee che vuoi copiare e deselezionarle prima di copiarle. – Jeff

0

per coloro che hanno problemi di copiare/incollare utilizzando ctrl-c & ctrl-v nel shell interprete Python su Windows in cui si mostra semplicemente:

>>> ^V 

sufficiente fare clic del mouse sulla barra del titolo della finestra dell'applicazione e selezionare di default o in, poi si desidera deselezionare Use legacy console (requires relaunch) assicurando che ora Enable Ctrl key shortcuts è selezionata, il n chiudi e riapri la finestra della console dell'interprete Python.

Problemi correlati