远程执行任意python代码——能做到吗?

问题描述 投票:0回答:6

我正在研究一个网格系统,它有许多非常强大的计算机。这些可以用来非常快速地执行 python 函数。我的用户有许多 python 函数,需要很长时间才能在工作站上计算,理想情况下,他们希望能够在远程强大的服务器上调用一些函数,但它看起来像是在本地运行。

Python 有一个名为“apply”的旧函数——现在它几乎没用了,因为 python 支持扩展调用语法(例如 **arguments),但是我需要实现一些像这样工作的东西:

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 开发有太多了解。他们只是想编写他们的函数并调用它。

澄清一下,我对讨论可能使用哪种网络协议来实现客户端和服务器之间的通信不感兴趣。我的问题是如何将函数及其依赖项封装为可以序列化和远程执行的单个对象。

我对在远程服务器上运行任意代码的安全隐患也不感兴趣——我们只是说这个系统纯粹是为了研究而设计的,而且它在一个防火墙严密的环境中。

python grid
6个回答
10
投票

看看 PyRO(Python 远程对象)它能够在集群中的所有计算机上设置服务,并直接调用它们,或通过名称服务器和发布-订阅机制间接调用它们。


4
投票

听起来你想做以下事情。

  • 定义共享文件系统空间。

  • 将您所有的 python 源放在这个共享文件系统空间中。

  • 定义将“执行文件”代码块的简单代理或服务器。

  • 您的客户然后联系代理(REST 协议与 POST 方法适用于
    this) 与代码块。 代理保存代码块并对该代码块执行

    execfile

由于所有代理共享一个公共文件系统,它们都具有相同的 Python 库结构。

我们使用一个简单的 WSGI 应用程序,我们称之为“批处理服务器”。我们有用于创建和检查远程请求的 RESTful 协议。


2
投票

Stackless 能够 pickle 和 unpickle 运行代码。不幸的是,当前的实现不支持此功能。


1
投票

您可以使用现成的集群解决方案,例如 Parallel Python。您可以相对轻松地设置多个远程从站并在它们上运行任意代码


0
投票

您可以使用 SSH 连接到远程 PC 并直接在另一台机器上运行命令。你甚至可以将 python 代码复制到机器上并执行它。


0
投票

语法:

猫./test.py | sshpass -p 'password' ssh user@remote-ip "python - script-arguments-if-any for test.py 脚本"

1) 这里“test.py”是本地python脚本。 2) sshpass 用于将ssh密码传递给ssh连接

© www.soinside.com 2019 - 2024. All rights reserved.