shell命令使用args运行python脚本,这是一个列表

时间:2018-10-08 17:43:08

标签: python python-3.x shell command

我需要使用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

3 个答案:

答案 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解码器的内部结构,我不能说它是否直接打开了任何安全漏洞,但是我可以说,您必须谨慎使用解码后的值,以确保自己不添加任何值。

希望这会有所帮助。