将数组作为命令行参数传递给python脚本
我正在从ruby程序调用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
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脚本的,它可以转换为列表。谢谢提示