1つのマシンでIPythonインスタンスを実行し、別のプロセスから(LAN経由で)接続します(いくつかのpythonコマンドを実行します)。zmqで可能であることを理解しています:- http://ipython.org/ipython-doc/dev/development/ipythonzmq.html 。
しかし、それを行う方法や、それがまだ可能かどうかについてのドキュメントは見つかりません。
何か助けていただければ幸いです!
編集
IPythonカーネルインスタンスに接続して送信できるようにしたいpythonコマンド。ただし、これはグラフィックツール(qtconsole)を介して行うべきではありませんが、接続したい別のpythonスクリプト内からそのカーネルインスタンスに...
例えば.
somehow_connect_to_ipython_kernel_instance
instance.run_command("a=6")
カーネルで別のPythonプログラムからコードを実行する場合、最も簡単な方法は BlockingKernelManager を接続することです。この時点での最良の例はPaul Ivanovの- vim-ipython クライアント、またはIPython独自の ターミナルクライアント 。
要旨:
IPYTHONDIR/profile_<name>/security/kernel-<id>.json
_に書き込みます。このファイルには、さまざまなクライアントが接続してコードを実行するために必要な情報が含まれています。実際の例:
シェルで_ipython kernel
_(または、すでに実行中のGUIとカーネルを共有する場合は_ipython qtconsole
_)を実行します。
_$> 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および表示データは_km.iopub_channel
_に渡され、Shell.execute()
によって返されたmsg_idを使用して、出力を特定の実行に関連付けることができます。
PS:これらの新機能のドキュメントの品質をお詫び申し上げます。やらなければならないことがたくさんあります。
interactivelyに接続するだけの場合は、SSH転送を使用できます。 Stack Overflowのどこにもまだ文書化されていませんが、この質問に最も近いものです。この回答はIpython 0.13でテストされています。 このブログ投稿 から情報を得ました。
リモートマシンでipython kernel
を実行します。
user@remote:~$ ipython3 kernel
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-25333.json
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
}
ローカルマシンでポート転送を設定します。
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
kernel-25333.json
ファイルをローカルマシンにコピーします。
user@local:~$ rsync -av user@remote:.ipython/profile_default/security/kernel-25333.json ~/.ipython/profile_default/security/kernel-25333.json
新しいカーネルを使用してローカルマシンで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
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')
ご了承ください:
現在、更新されたドキュメントを見つけることは非常に困難です。まだ何も http://jupyter-client.readthedocs.org/en/latest/ BlockingKernelClientの場合。 https://github.com/jupyter/jupyter_kernel_test の一部のコード。どんなリンクも歓迎します。
上記の答えは少し古いです。 ipython
の最新バージョンの解決策ははるかに単純ですが、1か所で十分に文書化されていません。だから私はそれをここに文書化しようと思った。
Windows
で実行されているipythonカーネルに接続するためのソリューションクライアントまたはサーバーのいずれかがlinux
またはその他のオペレーティングシステムである場合、kernel-1234.json
の場所を に基づいて適切に変更します。kernel-1234.jsonは、Jupyterの下にありますウィンドウズ?
ipykernel
がpip install ipykernel
を使用してインストールされていることを確認しますipython kernel -f kernel-1234.json
を使用してipykernel
を起動しますWindows
マシンでkernel-1234.json
ファイルを見つけます。ファイルはおそらく1234
ではなく異なる番号を持ち、おそらく 'C:\ Users\me\AppData\Roaming\jupyter\runtime\kernel-1234.json'にあります: https://stackoverflow.com/a/48332006/4752883pip install jupyter-console
またはpip install qtconsole
を使用してJupyterコンソール(またはJupyter Qtconsole/notebook)をインストールしますhttps://jupyter-console.readthedocs.io/en/latest/ipconfig
を実行して、WindowsサーバーのIPアドレスを確認します。 (Linuxでは、シェルプロンプトでifconfig
を実行します)。 kernel-1234.json
ファイルで、IPアドレスを127.0.0.1
からサーバーのIPアドレスに変更します。別のWindows
サーバーから接続している場合は、kernel-1234.json
ファイルをローカルコンピューターにコピーし、パスを書き留めます。kernel-1234.json
を含むフォルダーに移動し、jupyter console --existing kernel-1234.json
を使用してJupyter Consoleを起動します。Anacondaを使用している場合、OS XではJSONファイルは次の場所に保存されます
/ユーザー/ [ユーザー名] /ライブラリ/ Jupyter/runtime /
Windowsの場合:
c:\ Users [ユーザー名]\AppData\Roaming\jupyter\runtime \