如何在Python实例间传递对象
我有一个基因表达树的程序,用来控制一个机器人。我有两个文件,一个是 GP.py,另一个是 MyBot.py。我需要让 MyBot.py 能够访问在 GP.py 中创建的一个对象。
GP.py 是通过 os.system() 命令来启动 MyBot.py 的。
在 GP.py 文件里,我有成百上千个树对象,而 MyBot.py 需要对这些树进行评估。
我不能把这两个文件合并成一个 .py 文件,因为 MyBot.py 会被执行成千上万次,而 GP.py 需要对每棵树来评估 MyBot.py 的表现。
我知道怎么用 import GP.py 来导入方法和类的定义,但我需要的是 Tree 类对象的具体实例。有没有什么办法可以把这个树对象从第一个实例传递到第二个实例呢?
3 个回答
我们正在开发一个叫做 Versile Python 的框架(AGPL),这个框架可以用来进行进程间的对象级通信。虽然它还在开发中,但你可以先看看。这个 示例 展示了如何在 GP.py 和 MyBot.py 之间使用管道来访问远程对象。你还可以通过这个链接使用 原生 Python 对象,直接访问 Python 对象,或者编写自定义的 外部对象。
通常在这种情况下,我们会使用一种叫做RPC的技术。在Python中,我通常会用XML-RPC:
http://docs.python.org/library/simplexmlrpcserver.html
http://twistedmatrix.com/documents/current/web/howto/xmlrpc.html
这种方法比通过文件传递数据要灵活得多,而且即使程序在不同的机器上也能正常工作。
你可以用pickle模块把对象变成一串可以存储的数据(或者用json也可以)。
如果你真的想用os.system这个方法,那么你可以让MyBot.py把处理后的数据写入一个文件,等MyBot.py运行完后,GP.py就可以读取这个文件。
如果你改用subprocess模块,那么你可以让MyBot.py把处理后的数据直接输出到屏幕上,GP.py就可以通过管道读取这些数据。
如果你使用multiprocessing模块,那么你可以启动MyBot这个进程,并通过一个队列(Queue)来传递数据。