Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Выполнить произвольный код Python удаленно - можно ли это сделать?

Автор вопроса: Salim FadhleyОтветов: 6

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

В Python есть старая функция под названием "применить" - в наши дни она в основном бесполезна, поскольку 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. Они просто хотят написать свою функцию и вызвать ее.

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

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

  • Что мешает вам иметь общую библиотеку кода для клиента и серверов? Deestan 11.02.2009
  • Разве Celery не делает этого по своей сути? Я думаю, когда вы определяете функции как задачи, они упаковываются и отправляются рабочим, которые запускают их удаленно, с параметрами, которые вы помещаете в очередь заданий. Nick T 29.03.2016

pythongrid

Ответы

Ответ 1 · рейтинг 8 · Jim Carroll

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

Ответ 2 · рейтинг 4 · S.Lott

Похоже, вы хотите сделать следующее.

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

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

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

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

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

Мы делаем это с помощью простого приложения WSGI, которое мы называем "пакетным сервером". У нас есть протокол RESTful для создания и проверки удаленных запросов.

Ответ 3 · рейтинг 2 · Łukasz

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

Ответ 4 · рейтинг 1 · Ali Afshar

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

Ответ 5 · Ash

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

Ответ 6 · Amalraj Victory Raja

Синтаксис

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы