34

あるマシンでIPythonインスタンスを実行し、別のプロセスから(LAN経由で)それに接続したいと思います(いくつかのPythonコマンドを実行するため)。zmqで可能であることを理解しています:http://ipython.org/ipython-doc/dev/development/ipythonzmq.html

しかし、それを行う方法と、それがまだ可能かどうかについてのドキュメントを見つけることができません。

どんな助けでもいただければ幸いです!


編集

IPythonカーネルインスタンスに接続してPythonコマンドを送信できるようにしたいと思います。ただし、これはグラフィックツール(qtconsole)を介して行うべきではありませんが、別のPythonスクリプト内からそのカーネルインスタンスに接続できるようにしたいと思います...

例えば

external.py

somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
4

5 に答える 5

31

別のPythonプログラムのカーネルでコードを実行する場合、最も簡単な方法はBlockingKernelManagerに接続することです。現在のこの最良の例は、Paul Ivanovのvim-ipythonクライアント、またはIPython独自のターミナルクライアントです。

要旨:

  • ipythonカーネルはIPYTHONDIR/profile_<name>/security/kernel-<id>.json、さまざまなクライアントが接続してコードを実行するために必要な情報を含むJSON接続ファイルをで書き込みます。
  • KernelManagerは、カーネルとの通信(コードの実行、結果の受信など)に使用されるオブジェクトです。*

実例:

シェルで、次のことを行いますipython kernel(またはipython qtconsole、すでに実行中のGUIとカーネルを共有する場合)。

$> ipython kernel
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-6759.json

これにより、「kernel-6759.json」ファイルが作成されました

次に、このPythonスニペットを実行してKernelManagerに接続し、いくつかのコードを実行できます。

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')

実行の出力:

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

応答の解釈方法の詳細については、メッセージ仕様を参照してください。必要に応じて、stdout / errおよびdisplayデータがkm.iopub_channel渡され、によって返されたmsg_idを使用して、shell.execute()出力を特定の実行に関連付けることができます。

PS:これらの新機能のドキュメントの品質についてお詫び申し上げます。やるべきことはたくさんあります。

于 2012-04-02T15:51:48.307 に答える
28

インタラクティブに接続したいだけの場合は、SSH転送を使用できます。Stack Overflowのどこにもこれが文書化されているのはまだ見つかりませんでしたが、この質問が最も近いものです。この回答はIpython0.13でテストされています。このブログ投稿から情報を入手しました。

  1. ipython kernelリモートマシンで実行します。

    user@remote:~$ ipython3 kernel
    [IPKernelApp] To connect another client to this kernel, use:
    [IPKernelApp] --existing kernel-25333.json
    
  2. 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
    }
    
  3. ローカルマシンでポートフォワーディングを設定します。

    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
    
  4. kernel-25333.jsonファイルをローカルマシンにコピーします。

    user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
    
  5. 新しいカーネルを使用して、ローカルマシンでipythonを実行します。

    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
    
于 2013-03-07T10:39:13.593 に答える
21

jupyterに分割した後、minrkの回答に更新します。jupyter_client(4.1.1)を使用すると、最も単純なコードは次のようになります。

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')

ご了承ください:

  • jupyter_client.BlockingKernelClientは、jupyter_client.client.BlockingKernelClientとも呼ばれます。
  • シェル(km.shell_channel)には、execute()&get_msg()メソッドがありません。

現在、更新されたドキュメントを見つけることは非常に困難です。BlockingKernelClientについては、 http://jupyter-client.readthedocs.org/en/latest/にはまだ何もありません。https://github.com/jupyter/jupyter_kernel_testの一部のコード。リンクを歓迎します。

于 2016-03-04T09:55:25.100 に答える
5

上記の答えは少し古いです。の最新バージョンのソリューションipythonははるかに単純ですが、1か所で十分に文書化されていません。だから私はそれをここに文書化しようと思いました。

任意のOSからで実行されているipythonカーネルに接続するためのソリューションWindows

クライアントまたはサーバーのいずれかがlinuxまたは他のオペレーティングシステムである場合は、WindowsのJupyterにあるkernel-1234.jsonkernel-1234.jsonの場所に基づいて、の場所を適切に変更してください。

  1. Windowsベースのカーネルスタートで、をipykernel使用してインストールされていることを確認してくださいpip install ipykernel
  2. ipykernel使用を開始しますipython kernel -f kernel-1234.json
  3. kernel-1234.jsonマシン上でファイルを見つけますWindows。ファイルの番号はおそらく異なりますが1234、「C:\ Users \ me \ AppData \ Roaming \ jupyter \ runtime \ kernel-1234.json」にある可能性があります:https ://stackoverflow.com/a/ 48332006/4752883
  4. pip install jupyter-consoleまたはhttps://jupyter-console.readthedocs.io/en/latest/を使用してJupyterConsole(またはJupyter Qtconsole / notesbook)をインストールしますpip install qtconsole
  5. Windowsを使用している場合はipconfig、WindowsサーバーのIPアドレスを確認してください。(Linuxではifconfig、シェルプロンプトでを実行します)。kernel-1234.jsonファイルで、IPアドレスをサーバーのIPアドレスに変更します127.0.0.1。別のサーバーから接続している場合はWindows、ファイルをローカルコンピューターにコピーkernel-1234.jsonし、パスを書き留めます。
  6. を含むフォルダに移動し、を使用してJupyterConsolekernel-1234.jsonを起動しますjupyter console --existing kernel-1234.json
于 2018-01-18T23:55:48.023 に答える
1

Anacondaを使用している場合、OSXではJSONファイルは次の場所に保存されます。

/ Users/[ユーザー名]/Library / Jupyter / runtime /

Windowsの場合:

c:\ Users [username] \ AppData \ Roaming \ jupyter \ runtime \

于 2016-01-11T15:30:38.060 に答える