如何将python代码发送到另一台机器上执行?

如何将python代码发送到另一台机器上执行?,python,amazon-web-services,Python,Amazon Web Services,我正在AWS上构建一个测试应用程序。我有一台拥有应用程序的“主”计算机。有时,我希望能够将处理工作卸载到一些按需从机上。假设一个实例化的从机,只需要最少的软件(不包括我的主应用程序),我如何将Python代码的功能单元“发送”给一个或多个从机执行 我知道并接受,由于许多原因,这种体系结构可能不是最佳的——而且我知道,如果我能在启动时在实例上预安装相关代码,那么会更简单。但是让我们假设我们有一个硬约束,即从实例不能预加载到操作系统和一些基本库之外——例如,如果我想在另一台机器上喷射一些生成的代码,

我正在AWS上构建一个测试应用程序。我有一台拥有应用程序的“主”计算机。有时,我希望能够将处理工作卸载到一些按需从机上。假设一个实例化的从机,只需要最少的软件(不包括我的主应用程序),我如何将Python代码的功能单元“发送”给一个或多个从机执行

我知道并接受,由于许多原因,这种体系结构可能不是最佳的——而且我知道,如果我能在启动时在实例上预安装相关代码,那么会更简单。但是让我们假设我们有一个硬约束,即从实例不能预加载到操作系统和一些基本库之外——例如,如果我想在另一台机器上喷射一些生成的代码,该怎么办


编辑:StackOverflow是一个非常热门的资源!谢谢大家的回复。令人惊叹的。给我几天时间,我会回来报告。

你可以调查XMLPRClib


它需要一点设置,但一旦设置好,就很像是在调用本地函数。

使用SSH将代码scp到从机。使用专用于此目的的EC2密钥对设置从机。将EC2钥匙对放在主机上。这是简单和快速的设置


另一个选项是使用AWS Elastic MapReduce和/或来管理从机。这需要进行更多的设置工作,但会对故障更具鲁棒性,为您提供任务跟踪功能等。

我在各种方面多次遇到这个问题

选项1-
eval()
当我想快速破解一些东西时,我会在stdlib中使用它或它的一个表兄弟。将源文件传输到主文件,然后编译和评估:

src = getSourceFromMaster()
obj = compile(src, "master.py", "exec")
exec(obj)
只要将源代码从客户机传输到服务器的传输是可信的,并且源代码需要采取的操作相对简单,这就行得通。有几次,我需要在主机器和从机器之间进行更紧密的集成,需要大量的来回处理或复杂的数据结构。在这些情况下,我使用

备选方案2-热解 是一个完整的Python跨平台远程方法执行库。我在生产环境中使用它将处理过程从linux机器发送到windows机器,然后再发送回来,它非常稳定

他们文档中的示例:

主机:

# save this as greeting.py
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)
# save this as client.py
import greeting
name=raw_input("What is your name? ")
greeting_maker=greeting.GreetingMaker()
print greeting_maker.get_fortune(name)
$ python client.py
What is your name? Irmen
Hello, Irmen. Here is your fortune message:
Behold the warranty -- the bold print giveth and the fine print taketh away.
从机:

# save this as greeting.py
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)
# save this as client.py
import greeting
name=raw_input("What is your name? ")
greeting_maker=greeting.GreetingMaker()
print greeting_maker.get_fortune(name)
$ python client.py
What is your name? Irmen
Hello, Irmen. Here is your fortune message:
Behold the warranty -- the bold print giveth and the fine print taketh away.
输出:

# save this as greeting.py
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)
# save this as client.py
import greeting
name=raw_input("What is your name? ")
greeting_maker=greeting.GreetingMaker()
print greeting_maker.get_fortune(name)
$ python client.py
What is your name? Irmen
Hello, Irmen. Here is your fortune message:
Behold the warranty -- the bold print giveth and the fine print taketh away.
Pyro最棒的地方是client.py中的“
导入问候语”
”行——这些代码来自服务器

如果您是从裸操作系统安装开始的,那么可以在启动新实例后立即使用SSH向下推一个python脚本来托管这两个实例的客户端代码。然后,您将拥有一个很好的基础设施

我无法再详细地讲述这两种方法在AWS中的应用,也无法将它们与AWS基础设施提供的实用程序进行比较。欢迎提出意见或就此进行讨论

我想我们可以通过将python字节码文件从主机复制到从机来实现这一点。然而,我认为这种“移动代码”的方法是有漏洞的,因为这是你必须测试和调试的另一件事。它使运行的代码(以及何时运行的代码)变得不可预测,并且会产生一组更难诊断的全新问题。分布式计算已经很难管理,我不认为您需要不知道在哪里运行什么代码的复杂性

依我看,你最好放弃这个(人为的?)限制,你不能在工作机器上安装代码。一旦你放弃了这个限制,并在你的工人身上设置了代码,你就会有很多选择。仅举几个例子:

  • ,
  • ,
  • 一些RPC解决方案,如标准库中已经提到的xmlrpc库

为了管理Worker上的设置代码,您可以在中编写部署脚本。

我不同意这属于ServerFault。这是一个真正的编程/设计问题。您的Python代码片段将在什么上下文中执行?你说你的主应用程序不会出现在远程机器上,但你没有说会出现什么。代码段所需的上下文越多,您必须发送到远程的代码就越多。实际上,我正在尝试理解如何将代码“发送并执行”到远程(…在探索AWS的可能性时,仍然是一个障碍)。但一个简单有效的(在我的例子中)示例是:假设主控上有一个函数foo(),它拥有foo()的源代码,我如何将foo()发送到远程(…假设foo()所依赖的任何库依赖项已安装在远程设备上。您可以通过多种方式发送代码。默认情况下,AWS防火墙规则仅打开端口22,因此人们通常会使用SSH(例如:PyPI上的paramiko库)复制文件。或者,您可以只发送描述函数
foo
的字符串,然后使用编译和执行内置函数将该字符串转换为字节码,并在远程机器上执行。当然,我仍然认为最好的解决方案是放弃不能在从机上安装代码的要求ines。谢谢Mike-我已经在使用Fabric了,它太棒了。我只是有点被一个“主”机器的概念所诱惑,它可以协调事情,包括决定在哪里运行什么代码。当然,这是一个单点故障,但在AWS环境中这到底意味着什么?当然,在主服务器上协调事情。我只是提倡一种稍微不那么自动化的方法。另外,请记住,单点故障在AWS环境中仍然是不好的。但是,AWS为您提供了一些工具,让您能够应对。例如,您可以在多个ec2区域或区域拥有主控器。在任何情况下,您仍然需要处理pro