python - 如何在 python 中将对象作为命令行参数传递?

我有一个在 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/

相关文章:

Oracle - 带有列表范围分区的 EXCHANGE PARTITION 错误

bash - 如何用行缓冲提示包装命令?

json - Firebase - 如何使用 curl 编写?

zsh - 复制数组 1 :1 in zsh

php - 匹配 Google adwords 引荐来源网址

loops - 在同一文件中的 gnuplot 中绘制的列

react-native - React Native 的 Realm - 不区分大小写的搜索

php - 我可以在不使用 S3 API 的情况下从我的 Amazon S3 帐户下载文件吗?

memory-management - 当进程访问刚用 brk/sbrk 分配的地址时,内核会发生什

xml - XML 文档的第一行是什么?