我有一个在 Linux 服务器上运行的 Python 实例。我使用全局类创建了一个全局数组。我想将此类的对象作为命令行参数传递给将在 Windows VM 上运行的 python 函数。如何在 python 中将对象作为命令行参数传递? 或者有什么更好的方法吗?
最佳答案
您可以使用 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']
请注意,如果您试图通过特殊类(class),您将不得不做一些额外的工作;您需要具有与 JSON 格式相互转换的功能,1虽然 pickle 会自动执行操作,但仍需要访问该类(class)。 2
但是,我认为您最好在 VM 中运行任务执行服务器。虽然这些服务器选项的主要重点是允许可伸缩性,但它们在远程方面也相当出色。这抽象了所有通信和序列化解决方案,如@J.F。塞巴斯蒂安说,你真的不需要重新发明。
Celery 可能是最常用的任务执行服务器库。设置需要一些工作,但配置后使用起来很简单:使用 Celery 装饰器标记您的函数以使其成为任务对象,在 VM 上启动 worker,导入模块,并使用相同的参数调用类方法您将传递给函数本身。 3一旦一切正常,就可以将 Celery worker 设置为 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)
https://stackoverflow.com/questions/35656214/