Como funciona a pasta mágica de IPython?

93

Quero copiar o código Python já recuado / funções e classes inteiras para o IPython. Toda vez que tento o recuo está bagunçado e recebo a seguinte mensagem de erro:

IndentationError: unindent does not match any outer indentation level (<ipython-input-23-354f8c8be51b>, line 12)

If you want to paste code into IPython, try the %paste and %cpaste magic functions.

Framester
fonte
3
Eu sei, provavelmente já está em stackoverflow, mas não o encontrou após 3 pesquisas, então adicionei minha própria versão.
Framester

Respostas:

136

Você não pode copiar para IPython diretamente. Estas são as etapas:

  1. Copie as linhas que deseja copiar no IPython para a área de transferência
  2. Entre %pasteno IPython
  3. Pressione Enter
  4. Lucro!
Framester
fonte
47
% paste requer Tkinter, então, se você não tiver essa outra boa aposta é% cpaste
yekta
61
Na verdade, você pode copiar o código para IPython diretamente: pode ser necessário primeiro desabilitar a indentação automática digitando %autoindent.
Eric O Lebigot
Obrigado EOL! +1 para você
Framester,
5
Em Ipython 5 você pode apenas colar o código. Não precisa %pastemais. Leia esta resposta .
Levon
1
Você também não precisa do% antes paste.
wordsforthewise
40

Um esclarecimento sobre as etapas:

  • Primeiro, copie as linhas de destino em sua área de transferência.

  • Digite no prompt do iPython:

    • Se estiver no Tkinter: digite %paste
    • Caso contrário: insira %cpaste
  • Cole (Ctrl-V) e pressione Enter.

  • Em seguida, digite --e pressione Enter.

Por exemplo:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:for l in "Hello World":
:    print l,
:--
H e l l o   W o r l d
Yuly
fonte
3
Você não precisa usar Ctrl-V. Apenas digite% paste e pressione Enter.
SeF
21

A partir do Ipython 5 você não precisa de nenhum comando mágico, apenas cole

ipython5

Graças a prompt_toolkit, IPythonagora suporta:

  • Destaque de sintaxe enquanto você digita
  • Edição real de várias linhas (as teclas de seta para cima e para baixo se movem entre as linhas)
  • Colar multilinhas sem quebrar o recuo ou executar o código imediatamente
  • Melhor interface de autocompletar de código (planejamos melhorar ainda mais) Suporte opcional de mouse

Mais sobre isso aqui

Para atualizar ipythonpara a versão mais recente

pip install ipython --upgrade 
Levon
fonte
É possível colar várias linhas e executar o código automaticamente em cada linha?
Eric Duminil
sim, basta colar o código e pressionar enter. se você deseja depurar, verifique% pdb ou ipdb. exemplo
Levon
Isso também suporta a saída do Python repl, código que começa com três >sinais como este:>>> a = 1 + 2
Flimm
Todo esse tempo eu estive fazendo% cpaste .. legal!
Gershon Herczeg
1
Eu acho que isso depende do ambiente a partir do qual você está fazendo o colar e como você está fazendo o colar? Meu colega está usando o prompt de comando do Windows 10 para fazer SSH em nosso host Linux, abre o ipython em um contêiner do Docker lá e tenta colar o código já recuado ( clicando com o botão direito do mouse ) e consegue recuo extra mesmo no iPython 7.8.0. A maneira como eu entendo o comportamento do botão direito do prompt de comando é que na verdade ele pega tudo o que está na área de transferência e exibe caractere por caractere, como se você estivesse digitando. Portanto, o iPython não tem como saber que você está de fato colando.
Kal
6

%paste requer Tkinter. Se você estiver no ubuntu, você pode instalá-lo

sudo apt-get install python-tk

Se você estiver no Python3

sudo apt-get install python3-tk

Em seguida, reinicie o ipython e use %pastepara colar da sua área de transferência.

ChillarAnand
fonte
1

Uma das respostas úteis foi perdida nos comentários, portanto, queria reformulá-la junto com a adição de uma referência para outra função mágica útil do IPython.

Primeiro, para reafirmar o que @EOL disse, uma maneira de resolver o problema do OP é desligar a indentação automática executando primeiro %autoindente colando (não é necessário se você estiver usando%paste , é claro).

Agora, para adicionar mais informações ao que já está lá, um modo mais útil no IPython é o %doctest_modeque permite que você copie exemplos de colagem e trechos de teste de strings de doc. Isso também é útil para executar a saída de sessão Python interativa que você pode encontrar na documentação e fóruns online, sem ter que remover primeiro as strings de prompt.

haridsv
fonte
1

Para usuários do Ubuntu que usam Python 3.

O python-tké para Python 2.

Para fazer %pastefuncionar no Python 3, instale o python3-tkpacote:

sudo apt-get install python3-tk
utapyngo
fonte