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.
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:
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
:
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
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.
%autoindent
à l'indentation automatique OFF. après cela, vous pouvez passer votre code en IPython.
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)
une autre solution que j'ai récemment trouvée pour un problème similaire:
$ python << EOF
if 1:
print "foo"
print "bar"
EOF
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.