Comment pouvons-nous démarrer ipython REPL et lui demander de passer des arguments de ligne de commande à l'interpréteur python sous-jacent?

Par exemple, nous pouvons ouvrir un REPL en python avec une verbosité accrue en utilisant

python -v

Mais je ne pouvais pas voir comment passer ce drapeau lors de l'ouverture d'ipython.

3
wim 8 mars 2016 à 01:00

3 réponses

Meilleure réponse

Je dirais que la meilleure façon de le faire serait de lancer explicitement ipython avec python:

python /usr/bin/ipython

Comme l'exécutable ipython n'est qu'un script python; ou vous pouvez lancer ipython en disant à python de charger la bibliothèque ipython:

python -m IPython.frontend.terminal.ipapp

Puis vous pouvez ajouter tous les arguments natifs de python:

python -v /usr/bin/ipython
python -v -m IPython.frontend.terminal.ipapp

HTH

5
zmo 7 mars 2016 à 22:13

Cette option -v affecte le comportement de l'interpréteur lui-même, pas seulement le REPL. Vous obtenez les informations d'importation supplémentaires, que vous ajoutiez ou non l'option -i.

Voici le script par défaut qui lance ipython (ou au moins une version de celui-ci)

1522:~/mypy$ cat /usr/local/bin/ipython3.5
#!/usr/local/bin/python3.5

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

Et depuis une session ipython:

In [1153]: from IPython import start_ipython
In [1154]: start_ipython??
String form: <function start_ipython at 0xb697edac>
File:        /usr/lib/python3/dist-packages/IPython/__init__.py
Definition:  start_ipython(argv=None, **kwargs)
Source:
def start_ipython(argv=None, **kwargs):
   "..."
   from IPython.terminal.ipapp import launch_new_instance
    return launch_new_instance(argv=argv, **kwargs)

Finalement, les argv sont passés à un analyseur argparse. Ipython remplit cet analyseur avec des arguments dérivés de ses fichiers de configuration. Vous avez donc plusieurs options pour définir les paramètres - configuration par défaut, configuration de profil et ligne de commande. Mais tout cela, c'est après le lancement de l'interprète. Certaines choses sont exécutées dans le même cas avec un interpréteur REPL, mais pas toutes (-m, mais pas -v).

Lorsque -v est utilisé comme le suggère zmo, nous voyons toutes les importations de code ipython - qui sont assez nombreuses. Êtes-vous intéressé par ceux-ci, ou êtes-vous plus intéressé par les importations liées à votre propre script?

J'utilise ipython beaucoup pour tester les réponses, en particulier pour numpy. En fait, mon appel ipython par défaut a le drapeau --pylab. Mais pour tester des scripts autonomes, j'utilise plain python (souvent appelé à partir d'une fenêtre de terminal dans mon éditeur). Parfois, je vais %run un script de l'intérieur ipython. Cela charge le module dans l'espace de travail principal, ce qui facilite l'exécution de tests %timeit sur les fonctions.


D'autres scripts ipython utilisent

#!/usr/bin/python
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
    sys.exit(
        load_entry_point(...)

Je n'écris pas beaucoup de code en utilisant ce style, mais je ne vois pas comment ce type d'initiation peut transmettre argv à l'interpréteur. Au moment où le module a été chargé et commence à fonctionner, l'interpréteur est déjà en cours d'exécution.

En général, il semble que ipython gère les options comme -i, -m, -c de la même manière que le python standard. Il peut le faire avec son propre code, plutôt que de déléguer à l'interpréteur. Mais des choses comme -v, -O, -t s'appliquent à l'interpréteur, pas au REPL, et ne sont pas gérées par le code ipython.

0
hpaulj 8 mars 2016 à 03:15

Vous pouvez écrire votre propre script shebang ipython.

Ici, j'ai copié mon script ipython et ajouté le -v

#!/usr/local/bin/python3.5 -v

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

Maintenant, lorsque j'exécute ./vipython, j'obtiens de nombreuses pages d'informations import au démarrage et à l'arrêt.

Je comprends d'autres questions SO que je ne pourrais peut-être pas ajouter plusieurs options à une telle ligne de shebang.

Comment utiliser plusieurs arguments avec un shebang (c'est-à-dire #!)?

Donc par exemple

#!/usr/local/bin/python3.5 -vv

Fonctionne, mais

#!/usr/local/bin/python3.5 -v -v

Non - ça me donne

1008:~/mypy$ ./vipython
Unknown option: - 
usage: /usr/local/bin/python3.5 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.
1
Community 23 mai 2017 à 12:07