Удаленное ядро jupyter — другая виртуальная среда?

#python #python-3.x #jupyter-notebook

#python #python-3.x #jupyter-записная книжка

Вопрос:

Я использую пакет remote_ikernel для автоматического подключения к виртуальной машине Azure с виртуальной машины Azure. Две системы идентичны, то есть они имеют одинаковые среды python.

Я запускаю удаленное ядро с помощью

 ssh -oStrictHostKeyChecking=no {username}@{ip} sudo /anaconda/envs/py36/bin/ipython kernel
 

А затем обновите мой локальный kernel.json файл, заполнив параметры в приведенном ниже скрипте.

         {{
    "argv": [
        "/anaconda/envs/py35/bin/python",
        "-m",
        "remote_ikernel",
        "--interface",
        "ssh",
        "--host",
        "{username}@{ip}",
        "--kernel_cmd",
        "/anaconda/envs/{remote_python}/bin/ipython kernel -f {{host_connection_file}}",
        "{{connection_file}}"
    ],
    "display_name": "SSH {username}@{kernel_name}",
    "remote_ikernel_argv": [
        "/anaconda/envs/py35/bin/remote_ikernel",
        "manage",
        "--add",
        "--kernel_cmd=/anaconda/envs/{remote_python}/bin/ipython kernel -f {{connection_file}}",
        "--name=Remote VM",
        "--interface=ssh",
        "--host={username}@{ip}"
    ]
}}
 

Первая попытка
Однако мы хотим использовать не удаленный /anaconda/envs/py35/bin/python , а его py36 брата. Я надеялся решить эту проблему, настроив ее в 1-й команде, но это ничего не решает. Это также не помогло изменить что-либо py35 в kernel.json. Как мы можем этого добиться?

Вторая попытка (редактирование) Я адаптировал kernel.json , чтобы включить указатель на py36 среду. Смотрите обновленную версию выше. Приведенный ниже журнал выглядит нормально, но import sys; sys.executable по-прежнему показывает py35 версию.

 [I 11:54:57.549 remote_ikernel] Launching kernel over SSH.
[I 11:54:57.549 remote_ikernel] Login command: 'ssh -o StrictHostKeyChecking=no  username@ip'.
[I 11:54:57.889 remote_ikernel] Established connection; starting kernel.
[I 11:54:57.889 remote_ikernel] Current working directory /data/projects/...
[I 11:54:58.040 remote_ikernel] Running kernel command: '/anaconda/envs/py36/bin/ipython kernel -f ./rik_kernel-40d44e0d-4dac-4939-b018-74f4c82b6855.json'.
[I 11:54:59.357 NotebookApp] Adapting to protocol v5.1 for kernel 40d44e0d-4dac-4939-b018-74f4c82b6855
[I 11:54:59.358 NotebookApp] Restoring connection for 40d44e0d-4dac-4939-b018-74f4c82b6855:d877b8cff59245bf9ca5811d9310ee7f
[I 11:54:59.358 NotebookApp] Replaying 7 buffered messages
[I 11:55:28.382 remote_ikernel] Setting up tunnels on ports: 57033, 45674, 57305, 38105, 56085.
 

С отображением файла удаленного ядра

  {
  "shell_port": 45674,
  "iopub_port": 57305,
  "stdin_port": 38105,
  "control_port": 56085,
  "hb_port": 57033,
  "ip": "127.0.0.1",
  "key": "9e336436-...",
  "transport": "tcp",
  "signature_scheme": "hmac-sha256",
  "kernel_name": ""
}
 

Ответ №1:

Это то kernel_cmd , что запускается после установления удаленного подключения, поэтому, чтобы получить версию ipython py36 на удаленном компьютере, ваш kernel.json должен выглядеть больше как:

 
{
    "argv": [
        "/anaconda/envs/py35/bin/python",
        "-m",
        "remote_ikernel",
        "--interface",
        "ssh",
        "--host",
        "{username}@{ip}",
        "--kernel_cmd",
        "/anaconda/envs/py36/bin/ipython kernel -f {host_connection_file}",
        "{connection_file}"
    ],
    "display_name": "SSH {username}@{kernel_name}",
    "remote_ikernel_argv": [
        "/anaconda/envs/py35/bin/remote_ikernel",
        "manage",
        "--add",
        "--kernel_cmd=/anaconda/envs/py36/bin/ipython kernel -f {connection_file}",
        "--name=Remote VM",
        "--interface=ssh",
        "--host={username}@{ip}"
    ]
}
 

Это должно быть так же, как если бы вы вызывали remote_ikernel с помощью командной строки:

 remote_ikernel manage --add --kernel_cmd="/anaconda/envs/py36/bin/ipython kernel -f {connection_file}" --name="Remote VM" --interface=ssh --host={username}@{ip}
 

Комментарии:

1. Хм, я только что попробовал это, но когда я выполняю import sys; print(sys.executable) , я все еще нахожусь в удаленной py35 среде.

2. Немного обновил мой вопрос 🙂

Ответ №2:

Не уверен, что это все еще актуально, но на всякий случай:
используйте эту --remote-precmd опцию при добавлении своего ядра.
Согласно документам:

Команда для выполнения на удаленном хосте перед запуском ядра, но после перехода в рабочий каталог.

Вы можете использовать эту опцию для активации необходимой среды:

 --remote-precmd=source %PathToVenv%/Scripts/activate
 

Я использую его, и он работает с remote_ikernel версии 0.4.6, а мой пульт — Windows 10.

Для Windows команда будет выглядеть примерно так:

 --remote-precmd=%PathToVenv%\Scripts\activate.bat
 

Комментарии:

1. Когда вы пишете «Согласно документам», полезно добавить ссылку на раздел, содержащий ваше предложение

2. Добавлена ссылка на главную страницу проекта