将数组作为命令行参数传递给python脚本

将数组作为命令行参数传递给python脚本,python,ruby-on-rails,Python,Ruby On Rails,我正在从ruby程序调用python脚本,如下所示: sku = ["VLJAI20225", "VJLS1234"] qty = ["3", "7"] system "python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py #{sku} #{qtys}" 但是我想访问python脚本中的数组元素 print sys.argv[1] #gives [VLJAI20

我正在从ruby程序调用python脚本,如下所示:

sku = ["VLJAI20225", "VJLS1234"]
qty = ["3", "7"]
system "python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py #{sku} #{qtys}"
但是我想访问python脚本中的数组元素

print sys.argv[1]      
#gives [VLJAI20225,  expected ["VLJAI20225", "VJLS1234"]
print sys.argv[2]
#gives VJLS1234]     expected ["3", "7"]
"python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py \'#{sku}\' \'#{qtys}\'"
我觉得数组元素之间的空间将数组元素视为单独的参数。我可能错了


如何正确传递数组?

不是python专家,但快速修复方法是使用json:

system "python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py #{sku.to_json} #{qtys.to_json}"

然后在您的python脚本中进行解析。

不是python专家,但快速修复方法是使用json:

print sys.argv[1]      
#gives [VLJAI20225,  expected ["VLJAI20225", "VJLS1234"]
print sys.argv[2]
#gives VJLS1234]     expected ["3", "7"]
system "python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py #{sku.to_json} #{qtys.to_json}"
"python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py \'#{sku}\' \'#{qtys}\'"
然后在python脚本中进行解析

print sys.argv[1]      
#gives [VLJAI20225,  expected ["VLJAI20225", "VJLS1234"]
print sys.argv[2]
#gives VJLS1234]     expected ["3", "7"]
"python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py \'#{sku}\' \'#{qtys}\'"
也许是这样的


可能是这样的?

您需要找到一个合适的协议,通过您选择的接口对您的数据(数组、列表等)进行编码(这是非常普遍的)

在本例中,您选择了Unix进程调用机制作为接口,该机制只允许在调用过程中传递字符串列表。这个列表也是相当有限的(你不能通过,比如说,千兆字节),所以你可能想考虑通过两个进程之间的管道传递数据。 无论如何,你所能做的就是传递字节,所以我建议对你的数据进行相应的编码。G作为JSON字符串。这意味着用JSON对Ruby数组进行编码,传输JSON字符串,然后在Python端对接收到的JSON字符串进行解码,以再次获得正确的Python列表

这只是简单地描述了其背后的方法和理由

由于我对Ruby不太熟练,我将把这部分留给您(请参阅@apheading的答案),但在Python方面,您可以使用

import json

myList = json.loads(s)

要将JSON字符串
s
转换为Python列表
myList

,您需要找到一个合适的协议,通过您选择的接口对数据(数组、列表等)进行编码(这是非常普遍的)

在本例中,您选择了Unix进程调用机制作为接口,该机制只允许在调用过程中传递字符串列表。这个列表也是相当有限的(你不能通过,比如说,千兆字节),所以你可能想考虑通过两个进程之间的管道传递数据。 无论如何,你所能做的就是传递字节,所以我建议对你的数据进行相应的编码。G作为JSON字符串。这意味着用JSON对Ruby数组进行编码,传输JSON字符串,然后在Python端对接收到的JSON字符串进行解码,以再次获得正确的Python列表

这只是简单地描述了其背后的方法和理由

由于我对Ruby不太熟练,我将把这部分留给您(请参阅@apheading的答案),但在Python方面,您可以使用

import json

myList = json.loads(s)

要将JSON字符串
s
转换为Python列表
myList

,感谢您提供了非常有用的答案。但是,在通过
{sku.to_JSON}
{qtys.to_JSON}
之后,我得到了
ValueError(“没有可以解码的JSON对象”)
,我不能代表Ruby方面,所以在从JSON解码之前,您可能只想在Python部分进行调试输出,只需打印JSON字符串:
print s
(或者可能是
print sys.argv[1]
或类似内容)。很抱歉,我搞砸了,这很好。非常感谢AlfeThanks的帮助,他给出了一个非常有用的答案。但是,在传递
{sku.to_JSON}
{qtys.to_JSON}之后,我得到了
ValueError(“无法解码JSON对象”)
我不能代表Ruby方面,因此您可能只想在Python部分中进行调试输出,然后再从JSON解码,只需打印JSON字符串:
print s
(或者可能是
print sys.argv[1]
或类似内容)。很抱歉,我搞砸了,这很好。非常感谢Alfeth的帮助。这很有效,但数组是作为字符串传递到python脚本的,它可以转换为列表。感谢tipThis的工作,但数组是作为字符串传递到python脚本的,它可以转换为列表。谢谢提示