shell命令运行带有args的python脚本,这是一个列表[重复]

Posted

技术标签:

【中文标题】shell命令运行带有args的python脚本,这是一个列表[重复]【英文标题】:shell command run python script with args which is a list [duplicate] 【发布时间】:2019-03-13 10:27:06 【问题描述】:

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

系统显示: "('有错误"

如何将列表转换成脚本?

("store", "IDCODE", 18116485, 88779) 是一个 arg

【问题讨论】:

【参考方案1】:

shell 向您的程序传递一个字符串数组,Python 将其转换为字符串列表。 shell 不知道 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]

【讨论】:

【参考方案2】:

一种更简洁的方式来满足您的要求(主要是如果您需要其他参数)是从另一个参数中识别您的列表并枚举允许的类型(必要时进行转换),如下所示:

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 的替代品更好!

【讨论】:

真诚感谢您的回答【参考方案3】:

这是您可能喜欢的另一种选择:将其作为单个字符串发送并将其作为编码的 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 解码器的内部结构,我不能说它是否直接打开了任何安全漏洞,但我可以说你必须小心如何使用解码后的值,以确保不添加任何自己的值。

希望这会有所帮助。

【讨论】:

感谢您的回答

以上是关于shell命令运行带有args的python脚本,这是一个列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

impala shell,带有大写字母的 shell 命令

python使用subprocess.Popen运行bat脚本时报不支持输入重新定向错误分析

为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?

shell从外部读入参数调用另一个shell脚本的问题

使用带有列表的 shell=True 时忽略 subprocess.call() 参数 [重复]

需要从 Python 脚本运行 shell 命令并存储在变量中 [重复]