Ipython: lancer une entrée multiligne dans le terminal ipython et la console ipython

Créé le 15 oct. 2012  ·  14Commentaires  ·  Source: ipython/ipython

Dans qtconsole (via ctrl-enter ) et dans le cahier (via seulement enter dans une cellule), vous pouvez transformer n'importe quelle entrée de ligne en une entrée multiligne. Ce serait bien d'avoir quelque chose comme ça pour les points d'entrée du terminal et de la console.

Actuellement, une solution de contournement potentielle consiste à utiliser et if 1: pour la première ligne d'entrée, ce qui lance ensuite une entrée multiligne dans tous les clients, mais cela semble un peu gênant.

En général, dans la mesure du possible, je pense qu'il est logique d'avoir la parité des fonctionnalités entre les différents clients.

Exemple concret : je peux saisir l'entrée suivante à l'aide de qtconsole en appuyant sur ctrl-enter à la fin de chaque ligne :

In [2]: print "hello"
   ...: print "this is all one input"
   ...: print "same here..."
   ...: 

et si j'exécute cette ligne, puis que je démarre un client ipython basé sur un terminal et que j'appuie sur la flèche vers le haut, je verrai une invite appropriée :

In [1]: print "hello"
print "this is all one input"
print "same here..."

qui peut être exécuté et exécuté, mais il n'y a aucun moyen d'entrer une entrée multiligne de forme libre comme celle-ci à partir du terminal, ce qui rend le flux de travail gênant.

merci à @michaelpacer d'avoir porté cela à mon attention.

Commentaire le plus utile

Appuyer sur ctrl+o fonctionne pour moi (essayé dans les consoles cmd et conemu).

Aussi possible d'utiliser (

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

Lorsque vous avez fini de taper, revenez simplement à la première ligne et supprimez le ( .

Tous les 14 commentaires

Je pense que nous nous heurtons ici aux contraintes du terminal/readline. Autant que je sache, il n'y a pas de moyen facile de détecter ctrl-enter. Nous appelons simplement raw_input() et obtenons une chaîne renvoyée - ou une exception déclenchée si l'utilisateur appuie sur Ctrl-D ou Ctrl-C.

En tant que projet à plus long terme, il pourrait être possible de le faire en utilisant une bibliothèque comme pyrepl au lieu de readline. C'est quelque chose qui nous intéresse depuis un moment, mais personne n'a le temps d'enquêter de près. Une autre façon serait de construire une nouvelle interface en utilisant curses ou un outil similaire comme urwid.

Une chose que vous pouvez faire est d'appuyer sur ctrl-v, ctrl-j pour entrer une nouvelle ligne sans exécuter l'entrée. Je pense que cela fait partie de Bash lui-même car cela fonctionne également sur le terminal (ctrl-v dit de traiter le prochain raccourci clavier comme une séquence de contrôle et ctrl-j est une nouvelle ligne). Je n'ai pas eu l'occasion de jouer avec iTerm2 à ce sujet, mais peut-être est-il possible de mapper ctrl-enter sur cette double séquence d'une manière ou d'une autre?

Edit : Vous pouvez en effet reproduire cela dans iTerm2 au moins. Vous pouvez accéder à vos touches de raccourci globales et définir ctrl-entrée sur "Envoyer des codes hexadécimaux", puis : 0x16 0x0a

Serait-il possible d'obtenir ce type de fonctionnalité maintenant avec prompt_toolkit ?

Oui, mais pas avec un raccourci enter - il semble que le seul combo avec enter que nous puissions détecter avec enter soit Alt-Enter (ou Esc, Enter ), et nous l'utilisons déjà pour forcer l'exécution (c'est-à-dire n'ajoutez pas de saut de ligne). Nous pourrions le faire avec un autre raccourci, cependant - ou vous pouvez ajouter un raccourci personnalisé .

Une façon de faire cela dans IPython actuel consiste à appuyer sur F2, ce qui vous déposera dans un éditeur et placera le contenu dans votre entrée lorsque vous aurez terminé. Vous pouvez contrôler quel éditeur il ouvre en définissant la variable d'environnement $EDITOR .

Alt-Entrée sous Windows change les fenêtres ipython en plein écran.

En utilisant les derniers ipython et prompt_toolkit, et si vous avez activé vi-mode , vous pouvez taper votre commande, puis appuyer sur ESC , puis appuyer sur o . Cela créera une nouvelle ligne, comme dans vi.

De cette façon, vous pouvez avoir des commandes multilignes.

In [29] : %reset -s #----> press `ESC` then `o`
            %run foo.py

Réf

  1. Activation du mode Vi dans ipython : http://koo.fi/blog/2016/08/04/enable-vi-editing-mode-in-ipython-5/

Je viens de tomber sur ça. Je suis positif ctrl-enter utilisé pour créer une nouvelle ligne !?! Mais ce problème suggérerait que je me trompe :(

Une autre option consiste à interpréter le point-virgule comme un séparateur de ligne. par exemple

%run slow_script.py; !display_notification.sh

exécutera mon script python, puis exécutera un script bash.

Edit : cela ne fonctionne pas réellement, c'est juste une suggestion

Je le fais en utilisant ;

cv2.imshow('image', im) ;
cv2.waitKey(0) ;
cv2.destroyAllWindows()

Appuyer sur ctrl+o fonctionne pour moi (essayé dans les consoles cmd et conemu).

Aussi possible d'utiliser (

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

Lorsque vous avez fini de taper, revenez simplement à la première ligne et supprimez le ( .

Je le fais en utilisant ;

cv2.imshow('image', im) ;
cv2.waitKey(0) ;
cv2.destroyAllWindows()

Il ne semble pas que vous puissiez mélanger python et magics de cette façon :

In [5]: %run test.py ;\
   ...: !echo foo

hi

Appuyer sur ctrl + o fonctionne pour moi (essayé dans les consoles cmd et conemu).

Pour moi, c'est alt+o .

Pour moi c'est ctrl+o

Ctrl+o fonctionne pour moi dans ipython , mais pas jupyter console .

Ctrl+O fonctionne, ce problème peut être fermé

Cette page vous a été utile?
0 / 5 - 0 notes