我在linux服务器上运行了一个python实例。我使用全局类创建了一个全局数组。我希望将此类的传递对象作为命令行参数传递给我将在Windows VM上运行的python函数。如何在python中将对象作为命令行参数传递? 或者有更好的方法吗?
答案 0 :(得分:2)
您可以使用json.dumps()
和json.loads()
或pickle.dumps()
和pickle.loads()
来实现此目的:
>>> import json
>>> json.dumps(['Hi'])
'["Hi"]'
>>> json.loads(_)
['Hi']
>>> import pickle
>>> pickle.dumps(['Hi'])
b'\x80\x03]q\x00X\x02\x00\x00\x00Hiq\x01a.'
>>> pickle.loads(_)
['Hi']
请注意,如果你想要传授一个特殊课程,你将需要做一些额外的工作;您需要具有转换为JSON格式的函数1,而pickle将自动执行操作,但仍需要访问该类。2
但是,我认为您最好在VM中运行任务执行服务器。虽然这些服务器选项的主要关注点是允许可扩展性,但它们在远程方面也非常擅长。这抽象出了所有的通信和序列化解决方案,如@ J.F.塞巴斯蒂安说,你真的不需要重新发明。
Celery可能是最常用的任务执行服务器库。设置需要一些工作,但配置后很容易使用:用Celery装饰器标记你的函数,使其成为一个任务对象,启动VM上的worker,导入模块,并使用相同的参数调用类方法您将传递给函数本身。3一切正常后,Celery工作者可以设置为Windows服务。4
# app.py (adapted from examples in the Celery Getting Started tutorial
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def my_function(a, b):
return a * b
# main.py
import app
result = app.my_function.delay(4, 5)
print result.get()
有时候,Celery太麻烦了。如果您需要使用该功能中的第三方库,您必须在功能中导入它们或者将它们安装在Linux服务器上,这是由于Celery的直观安排。而且我个人在首先设置Celery时遇到了麻烦。
一个更简单的替代方案是TaskIt。5(完全披露:我是TaskIt的开发人员。)它使用更传统的服务器 - 客户端连接样式,因此所有必须工作的是标准TCP套接字。默认情况下,它使用JSON来序列化对象,但也支持pickle。
# server.py
from taskit.backend import BackEnd
def my_function(a, b):
return a * b
backend = BackEnd(dict(my_function=my_function))
backend.main()
# client.py
from taskit.frontend import FrontEnd
backend_addr = '127.0.0.1'
frontend = FrontEnd([backend_addr])
print frontend.work('my_function', 4, 5)
答案 1 :(得分:1)
使用您将使用的任何方法在不同计算机上运行的进程之间进行通信。
multiprocessing
module from stdlib支持此用例。 Jupyter支持远程内核。这是使用execnet
的代码示例。
如果首先将对象序列化为字符串,则可以将对象作为命令行参数传递。但是没有必要创建另一种远程执行python代码的方法。