Выполнить произвольный код Python удаленно - это можно сделать? - PullRequest
4 голосов
/ 11 февраля 2009

Я работаю над сеточной системой, в которой есть несколько очень мощных компьютеров. Они могут быть использованы для выполнения функций Python очень быстро. У моих пользователей есть ряд функций python, для расчета которых на рабочих станциях требуется много времени, в идеале они хотели бы иметь возможность вызывать некоторые функции на удаленном мощном сервере, но, похоже, они выполняются локально.

В Python есть старая функция под названием «apply» - в наши дни она в основном бесполезна, так как python поддерживает синтаксис расширенного вызова (например, ** аргументы), однако мне нужно реализовать что-то вроде этого:

rapply = Rapply( server_hostname ) # Set up a connection
result = rapply( fn, args, kwargs ) # Remotely call the function
assert result == fn( *args, **kwargs ) #Just as a test, verify that it has the expected value. 

Rapply должен быть классом, который можно использовать для удаленного выполнения некоторого произвольного кода (fn может быть буквально любым) на удаленном сервере. Он вернет результат, который вернет функция rapply. «Результат» должен иметь то же значение, как если бы я вызывал функцию локально.

Теперь давайте предположим, что fn - это пользовательская функция, мне нужен какой-то способ ее отправки по проводам на исполнительный сервер. Если бы я мог гарантировать, что fn всегда был чем-то простым, он мог бы быть просто строкой, содержащей исходный код на python ... но что, если бы это было не так просто?

Что если fn может иметь локальные зависимости: это может быть простая функция, которая использует класс, определенный в другом модуле, есть ли способ инкапсулировать fn и все, что требуется для fn, не является стандартным библиотека? Идеальное решение не потребовало бы от пользователей этой системы больших знаний о разработке Python. Они просто хотят написать свою функцию и вызвать ее.

Просто чтобы уточнить, мне не интересно обсуждать, какой тип сетевого протокола может быть использован для реализации связи между клиентом и сервером. Моя проблема заключается в том, как инкапсулировать функцию и ее зависимости в единый объект, который можно сериализовать и выполнять удаленно.

Меня также не интересуют последствия для безопасности запуска произвольного кода на удаленных серверах - давайте просто скажем, что эта система предназначена исключительно для исследований и находится в среде с высокой степенью защиты.

Ответы [ 6 ]

7 голосов
/ 11 февраля 2009

Взгляните на PyRO (удаленные объекты Python). Он имеет возможность устанавливать службы на всех компьютерах в кластере и вызывать их напрямую или косвенно через сервер имен и публикацию механизм подписки.

4 голосов
/ 11 февраля 2009

Звучит так, будто вы хотите сделать следующее.

  • Определение общего пространства файловой системы.

  • Поместите ВСЕ ваш источник Python в это пространство общей файловой системы.

  • Определите простые агенты или серверы, которые будут «выполнять» блок кода.

  • Затем ваш клиент связывается с агентом (протокол REST с методами POST хорошо работает для
    это) с блоком кода. Агент сохраняет блок кода и делает execfile для этого блока кода.

Поскольку все агенты имеют общую файловую систему, все они имеют одинаковую структуру библиотеки Python.

Мы работаем с простым приложением WSGI, которое мы называем «пакетный сервер». У нас есть протокол RESTful для создания и проверки удаленных запросов.

1 голос
/ 11 февраля 2009

Вы можете использовать готовое решение для кластеризации, такое как Parallel Python . Вы можете относительно легко настроить несколько удаленных ведомых и запустить произвольный код на них .

1 голос
/ 11 февраля 2009

Stackless имел возможность выбирать и открывать запущенный код. К сожалению, текущая реализация не поддерживает эту функцию.

0 голосов
/ 16 июня 2015

Синтаксис:

кат ./test.py | sshpass -p 'пароль' ssh user @ remote-ip "python - script-arguments-if-any для test.py script"

1) здесь "test.py" - это локальный скрипт на python. 2) sshpass используется для передачи пароля ssh на соединение ssh

0 голосов
/ 11 февраля 2009

Вы можете использовать SSH-соединение с удаленным ПК и напрямую запускать команды на другом компьютере. Вы даже можете скопировать код Python на компьютер и выполнить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...