2016-01-18 20 views
8

Molti esempi di python online mostrano sessioni interattive in python con i normali caratteri ">>>" e "..." prima di ogni riga.python: ignorando i principali ">>>" e "..." in modalità interattiva?

Spesso, non c'è modo di copiare questo codice senza ottenere anche questi prefissi.

In questi casi, se voglio ricollocare questo codice nel mio interprete python dopo la copia, devo fare un po 'di lavoro per rimuovere prima quei prefissi.

Qualcuno sa come ottenere Python o iPython (o qualsiasi altro interprete Python) per ignorare automaticamente i caratteri ">>>" e "..." sulle righe incollate?

Esempio:

>>> if True: 
...  print("x") 
... 
+1

@PadraicCunningham, tuttavia non è il comportamento predefinito nell'interprete 'python'. [IPython] (https://ipython.org/) non è incluso in Python. – Chris

+3

Sì ma l'op _did_ menziona IPython nella domanda :) – bakkal

+1

@Chris, non ho mai menzionato l'interprete python, ho parlato dell'interprete ipython che fa riferimento all'OP, * Qualcuno sa di un modo per ottenere python o ** iPython ** ... * –

risposta

2

Hai solo bisogno di spegnere quest'unità autoindent per includere >>> e ... in una pasta multilinea:

In [14]: %autoindent 
Automatic indentation is: OFF 
In [15]: >>> for i in range(10): 
    ....: ...  pass 
    ....: 

In [16]: >>> for i in range(10): 
    ...: ...  pass 
    ...: ... 
In [17]: >>> for i in range(10): 
    ...: ...  pass 
    ...: ... 

In [18]: %autoindent 
Automatic indentation is: ON 

In [19]: >>> for i in range(10): 
    ....:  ...  pass 
    ....:  
    File "<ipython-input-17-5a70fbf9a5a4>", line 2 
    ...  pass 
    ^
SyntaxError: invalid syntax 

o non copiare il >>> e funzionerà bene:

In [20]: %autoindent 
Automatic indentation is: OFF 

In [20]: for i in range(10): 
    ....: ...  pass 
    ....: 
+0

Sì. Funziona per me in ipython, ora che ho disattivato% autoindent. Questo è sufficiente per risolvere il mio problema. Grazie a tutti. – HippoMan

5

IPython farà questo per voi automaticamente.

In [5]: >>> print("hello") 
hello 

In [10]: >>> print(
    ....: ... "hello" 
    ....:) 
hello 
+0

Ho provato un ciclo 'for' (l'equivalente multilinea di' for i in range (10): pass') e non ha funzionato Ho ottenuto un SystaxError su "pass". – tdelaney

+0

Bene IPython proverà a rientrare automaticamente per te, quindi questo è probabilmente il problema. Si può fare '% cpaste' per attivare la modalità incolla, quindi fare' - 'per finire di incollare. –

1

Non proprio come incollare nella shell, ma il modulo doctest può essere utile. Esegue la scansione di un modulo python o di un normale file di testo alla ricerca di frammenti di script interattivi e quindi li esegue. Il suo caso d'uso principale è quello di unire documentazione e unit test. Supponiamo di avere un tutorial come

This is some code to demonstrate the power of the `if` 
statement. 

>>> if True: 
...  print("x") 
... 
x 

Remember, each `if` increases entropy in the universe, 
so use with care. 

>>> if False: 
...  print("y") 
... 

Salva in un file e quindi eseguire doctest

$ python -m doctest -v k.txt 
Trying: 
    if True: 
     print("x") 
Expecting: 
    x 
ok 
Trying: 
    if False: 
     print("y") 
Expecting nothing 
ok 
1 items passed all tests: 
    2 tests in k.txt 
2 tests in 1 items. 
2 passed and 0 failed. 
Test passed. 

doctest corre i frammenti di script e lo confronta con i risultati attesi.

UPDATE

Ecco uno script che prendere ciò che è negli appunti e incollare di nuovo i frammenti di script python. Copia il tuo esempio, esegui questo script e incollalo nella shell.

#!/usr/bin/env python3 

import os 
import pyperclip 

pyperclip.copy(os.linesep.join(line[4:] 
    for line in pyperclip.paste().split(os.linesep) 
    if line[:4] in ('>>> ', '... ')))