Copier-coller dans l'interpréteur interactif Python et indentation

ce morceau de code, test.py:

if 1:
   print "foo"
print "bar"

peut être exécuté avec succès avec execfile("test.py") ou python test.py, mais quand on essaie de copier-coller dans l'interpréteur python:

File "<stdin>", line 3
print "bar"
        ^
SyntaxError: invalid syntax

Pourquoi est-ce ainsi? L'interpréteur peut-il être configuré de telle manière qu'il puisse lire le texte copié-collé avec succès? Je suppose que peut affecter de taper dans l'interprète, mais c'est ok pour moi.

15
demandé sur Johnsyweb 2011-10-10 15:57:59

7 réponses

L'Indentation est probablement perdue ou cassée.

regardez IPython -- c'est un interpréteur Python amélioré avec de nombreuses fonctionnalités pratiques. L'un d'eux est une fonction magique %paste qui vous permet de coller plusieurs lignes de code.

Il a aussi l'onglet de l'achèvement, de l'auto-indentation.. et beaucoup plus. Jetez un oeil à leur site.


en utilisant %paste dans ipython:

enter image description here

et copier-coller des choses est l'une des choses fixes dans l'intervalle qt de la console, voici l'aide d'un bon vieux copier-coller de votre bloc de code "fonctionne" dans la nouvelle ipython qtconsole:

enter image description here

17
répondu rplnt 2011-10-10 14:14:08

Je ne connais aucun truc pour l'invite de commande standard, mais je peux vous suggérer un interpréteur plus avancé comme IPython qui a une syntaxe spéciale pour les multi-ligne-coller:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:for c in range(3):
:    print c
:
:--
0
1
2

une autre option est le bpython interpréteur qui a un mode de coller automatique (si vous tapez trop vite pour être humain):

>>> for c in range(3):
...     print c
... 
0
1
2
>>> 
 <C-r> Rewind  <C-s> Save  <F8> Pastebin  <F9> Pager  <F2> Show Source 
18
répondu naufraghi 2011-10-10 12:33:58

des lignes de Continuation sont nécessaires lors de la saisie d'une construction multi-ligne. -- mode interactif, Le Tutoriel Python (v2) ( v3)

vous devez donc entrer:

if 1:
   print "foo"

print "bar"

Je n'ai pas encore trouvé d'explication appropriée pour expliquer pourquoi c'est différent d'une session non interactive, hélas.

6
répondu Johnsyweb 2015-03-21 05:17:34

%autoindent à l'indentation automatique OFF. après cela, vous pouvez passer votre code en IPython.

6
répondu Awais 2015-03-30 08:09:41

toutes les réponses actuelles suggèrent que vous changiez en IPython. Pour une solution python uniquement, vous pouvez utiliser d'habillage de texte pour supprimer les espaces de tête des lignes.

e.g.

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
1
répondu eqzx 2017-09-19 16:52:19

une autre solution que j'ai récemment trouvée pour un problème similaire:

$ python << EOF
if 1:
   print "foo"
print "bar"

EOF
1
répondu kaustubh 2018-06-27 12:20:35

si vous êtes comme moi et utilisez le bloc-notes++ (pour copier et coller à partir de),essayez de remplacer les tabulations par des espaces en allant dans Paramètres > Préférences>langue et vérifier le remplacer par des espaces.



J'ai eu ce problème moi-même depuis si longtemps et j'ai trouvé que python.l'exe reconnaît les espaces.

0
répondu Flavio Rajta 2017-10-17 22:23:58