我需要使用shell命令来运行python脚本
但args是一个列表 python脚本:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
def main(task_list):
print('task_list:',task_list)
if __name__=='__main__':
main(sys.argv[1])
当我使用shell python
python scrpit.py [("store", "IDCODE", 18116485, 88779)]
系统显示: “('有错误”
我如何将列表转换成脚本?
(“商店”,“ IDCODE”,18116485、88779)是arg
答案 0 :(得分:0)
shell向您的程序传递一个字符串数组,Python将其转换为字符串列表。外壳不知道Python语法。您可以像
那样调用程序$ python scrpit.py '[("store", "IDCODE", 18116485, 88779)]'
然后使用ast.literal_eval
将其解析为列表。
import sys
import ast
if len(sys.argv) == 2:
data = ast.literal_eval(sys.argv[1])
print(data)
输出
[('store', 'IDCODE', 18116485, 88779)]
但是,将args作为单独的字符串接收会更可靠。
import sys
if len(sys.argv) == 5:
name, code, num1, num2 = sys.argv[1:]
num1, num2 = int(num1), int(num2)
data = [name, code, num1, num2]
print(data)
称呼它
$ python scrpit.py "store" "IDCODE" 18116485 88779
输出为
['store', 'IDCODE', 18116485, 88779]
答案 1 :(得分:0)
一种更简洁的方法来执行您的请求(通常是否需要其他参数)是从另一个参数中识别列表并枚举允许的类型(如有必要,进行转换),看起来像这样:
import sys, getopt
sh_params, args = getopt.getopt(sys.argv[1:], "l:")
def convert_type(elem):
for fn in (int, lambda e: e.strip('"')): # Lambda is the string conversion function and int is auto-cast fct
try:
return fn(elem)
except ValueError:
pass
return elem
my_list = []
for param, val in sh_params:
if param == "-l":
my_list = [convert_type(elem) for elem in val.strip('[]').split(', ')]
print(my_list)
这是命令和结果:
$ python3 scrpit.py -l '["store", "IDCODE", 18116485, 88779]'
$ ['store', 'IDCODE', 18116485, 88779]
请记住,PM 2Ring的替代方案仍然更好!
答案 2 :(得分:0)
这是您可能想要的一种替代方法:将其作为单个字符串发送并作为编码的json导入。只需“导入json”并更改您的main()调用即可,如下所示:
main(json.JSONDecoder().decode(sys.argv[1]))
并使用单引号内的参数调用脚本,但省略了(),因此它看起来像是正确的json编码:
python scrpit.py '["store", "IDCODE", 18116485, 88779]'
这给我的输出看起来像:
('task_list:', [u'store', u'IDCODE', 18116485, 88779])
这也将允许您发送更复杂的结构,例如:
python try.py '{"p2": {"a": 1, "b": 2}, "p1": ["a", "B", "c"]}'
('task_list:', {u'p2': {u'a': 1, u'b': 2}, u'p1': [u'a', u'B', u'c']})
如果不分析json解码器的内部结构,我不能说它是否直接打开了任何安全漏洞,但是我可以说,您必须谨慎使用解码后的值,以确保自己不添加任何值。
希望这会有所帮助。