Je souhaite exécuter une instance IPython sur une machine et y connecter (sur un réseau local) à partir d'un processus différent (pour exécuter des commandes python). Je comprends que cela soit possible avec zmq: http://ipython.org/ipython-doc/dev/development/ipythonzmq.html .
Cependant, je ne trouve pas de documentation sur la façon de le faire et même si cela est encore possible.
Toute aide serait appréciée!
MODIFIER
J'aimerais pouvoir me connecter à l'instance de noyau IPython et lui envoyer des commandes python. Cependant, cela ne devrait pas être fait via un outil graphique (qtconsole), mais je veux pouvoir me connecter à cette instance du noyau à partir d'un script python différent ...
par exemple.
somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
Si vous souhaitez exécuter du code dans un noyau à partir d'un autre programme Python, le moyen le plus simple consiste à connecter un BlockingKernelManager . Le meilleur exemple en ce moment est le vim-ipython client de Paul Ivanov, ou le client terminal client de IPython.
L'essentiel:
IPYTHONDIR/profile_<name>/security/kernel-<id>.json
, qui contiennent les informations nécessaires à la connexion et à l’exécution de code par divers clients.Un exemple de travail:
Dans un shell, faites ipython kernel
(ou ipython qtconsole
, si vous souhaitez partager un noyau avec une interface graphique déjà en cours d'exécution):
$> ipython kernel
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-6759.json
Ceci a écrit le fichier 'kernel-6759.json'
Ensuite, vous pouvez exécuter cet extrait de code Python pour connecter un KernelManager et exécuter du code:
from IPython.lib.kernel import find_connection_file
from IPython.zmq.blockingkernelmanager import BlockingKernelManager
# this is a helper method for turning a fraction of a connection-file name
# into a full path. If you already know the full path, you can just use that
cf = find_connection_file('6759')
km = BlockingKernelManager(connection_file=cf)
# load connection info and init communication
km.load_connection_file()
km.start_channels()
def run_cell(km, code):
# now we can run code. This is done on the Shell channel
Shell = km.Shell_channel
print
print "running:"
print code
# execution is immediate and async, returning a UUID
msg_id = Shell.execute(code)
# get_msg can block for a reply
reply = Shell.get_msg()
status = reply['content']['status']
if status == 'ok':
print 'succeeded!'
Elif status == 'error':
print 'failed!'
for line in reply['content']['traceback']:
print line
run_cell(km, 'a=5')
run_cell(km, 'b=0')
run_cell(km, 'c=a/b')
La sortie d'une course:
running:
a=5
succeeded!
running:
b=0
succeeded!
running:
c=a/b
failed!
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/Users/minrk/<ipython-input-11-fb3f79bd285b> in <module>()
----> 1 c=a/b
ZeroDivisionError: integer division or modulo by zero
voir message spec pour plus d'informations sur l'interprétation de la réponse. Le cas échéant, les données stdout/err et display passeront par km.iopub_channel
, et vous pouvez utiliser le msg_id renvoyé par Shell.execute()
pour associer la sortie à une exécution donnée.
PS: Je m'excuse pour la qualité de la documentation de ces nouvelles fonctionnalités. Nous avons beaucoup d'écriture à faire.
Si vous souhaitez simplement vous connecter de manière interactive , vous pouvez utiliser le transfert SSH. Je n'ai trouvé cette documentation nulle part ailleurs sur Stack Overflow, et pourtant cette question est la plus proche. Cette réponse a été testée sur Ipython 0.13. J'ai eu l'information de cet article de blog .
Exécutez ipython kernel
sur la machine distante:
user@remote:~$ ipython3 kernel
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-25333.json
Regardez le fichier kernel-25333.json
:
user@remote:~$ cat ~/.ipython/profile_default/security/kernel-25333.json
{
"stdin_port": 54985,
"ip": "127.0.0.1",
"hb_port": 50266,
"key": "da9c7ae2-02aa-47d4-8e67-e6153eb15366",
"Shell_port": 50378,
"iopub_port": 49981
}
Configurez la redirection de port sur la machine locale:
user@local:~$ ssh user@remote -f -N -L 54985:127.0.0.1:54985
user@local:~$ ssh user@remote -f -N -L 50266:127.0.0.1:50266
user@local:~$ ssh user@remote -f -N -L 50378:127.0.0.1:50378
user@local:~$ ssh user@remote -f -N -L 49981:127.0.0.1:49981
Copiez le fichier kernel-25333.json
sur la machine locale:
user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
Exécutez ipython sur la machine locale en utilisant le nouveau noyau:
user@local:~$ ipython3 console --existing kernel-25333.json
Python 3.2.3 (default, Oct 19 2012, 19:53:16)
Type "copyright", "credits" or "license" for more information.
IPython 0.13.1.rc2 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import socket; print(socket.gethostname())
remote
Mise à jour de la réponse de minrk après la scission en jupyter. Avec Jupyter_client (4.1.1) , Le code le plus simple ressemble à quelque chose comme:
import jupyter_client
cf=jupyter_client.find_connection_file('6759')
km=jupyter_client.BlockingKernelClient(connection_file=cf)
km.load_connection_file()
km.execute('a=5')
Notez que:
Actuellement, il est assez difficile de trouver une documentation mise à jour. rien encore sur http://jupyter-client.readthedocs.org/en/latest/ pour BlockingKernelClient. Certains codes dans https://github.com/jupyter/jupyter_kernel_test . Tout lien est le bienvenu.
Les réponses ci-dessus sont un peu vieilles. La solution pour la dernière version de ipython
est beaucoup plus simple mais n’est pas bien documentée à un endroit donné. J'ai donc pensé documenter cela ici.
Windows
Si le client ou le serveur est une linux
ou un autre système d'exploitation, modifiez simplement l'emplacement de kernel-1234.json
en fonction de Où kernel-1234.json se trouve-t-il dans Jupyter sous Windows?
ipykernel
est installé à l'aide de pip install ipykernel
ipykernel
en utilisant ipython kernel -f kernel-1234.json
kernel-1234.json
sur votre machine Windows
. Le fichier portera probablement un numéro différent, pas 1234
, et sera très probablement situé dans 'C:\Utilisateurs\me\AppData\Roaming\jupyter\runtime\kernel-1234.json': https://stackoverflow.com/a/48332006/4752883pip install jupyter-console
ou pip install qtconsole
https://jupyter-console.readthedocs.io/en/latest/ipconfig
pour connaître l'adresse IP de votre serveur Windows. (Sous Linux, faites une ifconfig
à l'invite du shell). Dans le fichier kernel-1234.json
, remplacez l'adresse IP par 127.0.0.1
par l'adresse ip de votre serveur. Si vous vous connectez depuis un autre serveur Windows
, copiez le fichier kernel-1234.json
sur votre ordinateur local et notez le chemin. kernel-1234.json
et démarrez Jupyter Console using jupyter console --existing kernel-1234.json
Si vous utilisez Anaconda, sous OS X, le fichier JSON est stocké sur
/ Utilisateurs/[nom d'utilisateur]/Bibliothèque/Jupyter/runtime /
Sous Windows:
c:\Utilisateurs [nom d'utilisateur]\AppData\Roaming\jupyter\runtime \