Comment puis-je vérifier si le code est exécuté dans le IPython notebook?
J'ai quelques Python exemple de code que j'aimerais partager cela doit faire quelque chose de différent si elle est exécutée dans le terminal Python /IPython ou dans le IPython notebook.
Comment puis-je vérifier à partir de mon code Python si c'est de la course dans le IPython notebook?
- Je suggère d'accepter Gustavo Bezerra de la réponse. Actuellement accepté réponse ne répond pas à la question, et de Gustavo réponse est le plus marqué réponse qui fonctionne encore dans la dernière version de Jupyter ordinateur Portable.
Vous devez vous connecter pour publier un commentaire.
La question est: que voulez-vous exécuter différemment.
Nous faisons de notre mieux dans IPython prévenir le noyau de savoir pour quel type d'interface est connecté, et en fait, vous pouvez même avoir un noyau relié à de nombreuses différentes interfaces en même temps. Même si vous pouvez prendre un coup d'oeil sur le type de
stderr/out
de savoir si vous êtes dans un ZMQ noyau ou pas, il n'a pas de garanties vous de ce que vous avez sur l'autre côté. Vous pourriez même pas des interfaces à tous.Vous devriez écrire votre code dans un frontend manière indépendante, mais si vous voulez afficher des choses différentes, vous pouvez utiliser le riche système d'affichage (lien épinglé à la version 4.x de IPython) pour afficher des choses différentes en fonction de l'interface, mais l'interface sera de choisir, pas à la bibliothèque.
\x1b[A
(déplacer vers le haut), il n'est donc pas possible d'imprimer imbriqués bars. Pas de problème avec ipywidgets, on peut utiliser natif Jupyter widgets pour afficher les barres de progression. Mais ensuite, nous avons deux moyens différents d'affichage d'une barre de progression, et une application pourrait voulez savoir ce qu'est l'environnement d'affichage, afin d'adapter et d'impression compatibles bar.%matplotlib inline
quand il agit comme un ordinateur portable, mais pas dans un terminal, puisque ce n'est pas nécessaire.display(HTML(...))
dans mon script. Lorsque vous exécutez à partir d'un ordinateur portable, il fonctionne. Lors de l'une de script Python, il imprime juste<IPython.core.display.HTML object>
qui est inutile, donc je besoin pour ouvrir manuellement un navigateur pour afficher le code HTML, ou de convertir le HTML pour quelque chose que je peux l'imprimer dans le terminal.Pour vérifier si vous êtes dans un ordinateur portable, qui peut être importante, par exemple lors de la détermination de ce genre de progressbar à utiliser, cela a fonctionné pour moi:
cfg['IPKernelApp']['parent_appname']
est unIPython.config.loader.LazyConfigValue
, qui ne se compare pas àTrue
avec"iypthon-notebook"
IPython.kernel.zmq.zmqshell.ZMQInteractiveShell
instance dans ipynb (Jupyter) et unIPython.terminal.interactiveshell.TerminalInteractiveShell
dans un terminal REPL, dans le cas où vous avez besoin de différencier les ordinateurs portables et terminaux/consoles (qui affecte le tracé).try
bloc avec:return str(type(get_ipython())) == "<class 'ipykernel.zmqshell.ZMQInteractiveShell'>"
La suite travaillé pour mes besoins:
Il retourne
'TerminalInteractiveShell'
sur un terminal IPython,'ZMQInteractiveShell'
sur Jupyter (ordinateurs portables ET qtconsole) et échoue (NameError
) sur une base régulière de l'interpréteur Python. La méthodeget_python()
semble être disponible dans l'espace de noms global par défaut lors de IPython est commencé.En l'enveloppant dans une fonction simple:
Ci-dessus a été testé avec Python 3.5.2, IPython 5.1.0 et Jupyter 4.2.1 sur macOS 10.12 et Ubuntu 14.04.4 LTS
jupyter console
, malheureusementget_ipython()
retourne une instance deZMQInteractiveShell
aussiget_ipython().__class__.__module__ == "google.colab._shell"
test.py
puis exécutezfrom test import isnotebook; print(isnotebook())
dans un Jupyter ordinateur Portable, il imprimeTrue
. (Testé sur Cahier des versions de serveur 5.2.1 et 6.0.1.)Vous pouvez vérifier si python est en interactive mode avec l'extrait suivant [1]:
J'ai trouvé cette méthode très utile parce que je fais beaucoup de prototypage dans le cahier. Pour des fins de test, j'utilise les paramètres par défaut. Sinon, j'ai lu les paramètres de
sys.argv
.À la suite de la mise en œuvre de
autonotebook
, vous pouvez dire si vous êtes dans un ordinateur portable en utilisant le code suivant.is_interactive()
ne fait pas de distinction entre ordinateur portable et la console.%run
de ipython est non-interactif. On pourrait dire qu'il devrait être, mais il est encore un piège.is_interactive
) me semble être essentiellement pas à la question. Il est également douteuse exactitude; que @marscher points, il compte tout exécuter à l'aide depython -c
comme étant en mode "interactif", même si ce n'est pas vrai. Je ne veux pas le faire moi-même puisque ce n'est pas ma réponse, mais je pense que cela pourrait être améliorée par la simple suppression de l'ensemble de la première moitié de la réponse.Récemment, j'ai rencontré un bug dans Jupyter portable qui a besoin d'une solution de contournement, et je voulais le faire sans perdre la fonctionnalité dans d'autres coquilles. J'ai réalisé que keflavich de la solution ne fonctionne pas dans ce cas, parce que
get_ipython()
est disponible directement à partir de l'ordinateur portable, et non pas à partir de modules importés. J'ai donc trouvé un moyen de détecter, à partir de mon module s'il est importé et utilisé à partir d'un Jupyter portable ou pas:Commentaires sont appréciés si c'est assez solide.
Manière similaire, il est possible d'obtenir des informations concernant le client, et IPython version:
'Ipython' in sys.modules
évalue àFalse
. Peut-être vous dire'IPython' in sys.modules
? C'estTrue
dans mon Jupyter de l'environnement. Lesys.modules
dictionnaire n'a pas également inclure la'ipykernel'
- clés lors de l'exécution à l'intérieur d'un ordinateur portable.Les captures suivantes le cas de https://stackoverflow.com/a/50234148/1491619 sans avoir besoin d'analyser les données en sortie de
ps
Autant que je sache, Ici a 3 sortes de ipython utilisé
ipykernel
ipython qtconsole
("qtipython" pour faire court)utilisation
'spyder' in sys.modules
peut distinguer spydermais pour qtipython et jn est difficile de distinguer la cause
ils ont même
sys.modules
et même IPython config:get_ipython().config
J'ai trouver un autre entre qtipython et jn:
de la première exécution de
os.getpid()
dans IPython shell obtenir le numéro de pidpuis exécutez
ps -ef|grep [pid number]
mon qtipython pid est 8699
yanglei 8699 8693 4 20:31 ? 00:00:01 /home/yanglei/miniconda2/envs/py3/bin/python -m ipykernel_launcher -f /run/user/1000/jupyter/kernel-8693.json
mon jn pid est 8832
yanglei 8832 9788 13 20:32 ? 00:00:01 /home/yanglei/miniconda2/bin/python -m ipykernel_launcher -f /run/user/1000/jupyter/kernel-ccb962ec-3cd3-4008-a4b7-805a79576b1b.json
différents de qtipython et jn est la ipython json nom, jn json nom de plus de qtipython de
donc, nous pouvons détection automatique de tous les Environnement Python par le code suivant:
le code source est ici: Détection Python Environnement, en Particulier les distinguer Spyder, Jupyter ordinateur portable, Qtconsole.py
Je recommande d'éviter de détecter spécifiques frontend parce qu'il y a trop d'entre eux. Au lieu de cela, vous pouvez simplement tester si vous exécutez à partir de l'intérieur de iPython environnement:
Ci-dessus sera de retour
False
si vous appelezrunning_from_ipython
de d'habitude python en ligne de commande. Lorsque vous appelez à partir de Jupyter Portable, JupyterHub, iPython shell, Google Colab etc, alors il sera de retourTrue
.get_ipython()
retourne<ipykernel.zmqshell.ZMQInteractiveShell at 0x7f750ba94320>
.Je suis en utilisant Django Shell Plus de lancer IPython, et je voulais faire "en cours d'exécution dans le cahier" disponible en tant que Django valeur de réglage.
get_ipython()
n'est pas disponible lorsque le chargement de paramètres, j'ai donc l'utiliser (ce qui n'est pas à l'épreuve des balles, mais assez bon pour le développement local environnements, il est utilisé dans d'):Testé pour python 3.7.3
Disponible implémentations ont le nom
__builtins__
disponibles dans le cadre de leur globals qui btw. peut être récupérée par la fonction globals().Si un script est en cours d'exécution dans un Ipython de l'environnement, puis
__IPYTHON__
doit être un attribut de__builtins__
.Le code ci-dessous, par conséquent, renvoie
True
de s'exécuter dans Ipython ou bien il donneFalse