当前位置: 首页 > 知识库问答 >
问题:

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

扶誉
2023-03-14

我需要使用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)是一个参数

共有3个答案

仲孙宇定
2023-03-14

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

希望这能有所帮助。

陈法
2023-03-14

一个更干净的方法来做你所要求的(主要是如果你需要其他参数)是从另一个参数中识别你的列表并枚举允许的类型(如果需要转换),这看起来像这样:

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

牧飞鹏
2023-03-14

shell向程序传递一个字符串数组,Python将其转换为字符串列表。shell不知道Python语法。你可以把你的程序叫做

$ python scrpit.py '[("store", "IDCODE", 18116485, 88779)]'

然后使用ast.literal\u eval将其解析为一个列表。

import sys
import ast

if len(sys.argv) == 2:
    data = ast.literal_eval(sys.argv[1])
    print(data)

输出

[('store', 'IDCODE', 18116485, 88779)]

但是,将arg作为单独的字符串接收会更加健壮。

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]
 类似资料:
  • 在Linux或Mac上运行带有命令行参数的Node.js脚本的正确语法是什么? 要在没有参数的情况下运行脚本,我只需使用命令node stuff。但是在这种情况下,我想运行一个名为stuff的脚本。js带有参数“blah”、“hee”、“woohoo!” 。

  • 问题内容: 我该如何使用子流程模块运行bash脚本,必须为此提供几个参数? 这是我目前正在使用的: bash脚本似乎没有接受任何参数。非常感谢您提供任何见解! 问题答案: 将参数作为列表传递,请参阅docs中的第一个代码示例: 如果不是字符串;在传递到:之前将其转换为字符串。

  • 问题内容: 我想从另一个Python脚本运行一个Python脚本。我想像使用命令行一样传递变量。 例如,我会跑我的,将通过值(0,1,2,3)的列表迭代第一个脚本,并通过那些到第二脚本,然后,等 我发现了Stack Overflow问题1186789,这是一个类似的问题,但是ars的答案调用了一个函数,在这里我想运行整个脚本,而不仅仅是函数,而balpha的答案则调用了脚本,但没有参数。我将其更改

  • 问题内容: 我需要接受命令行参数才能以以下格式运行Go程序: 我正在使用。但是它只接受到‘1-‘。’> A’被跳过。 非常感谢您对解决此问题的任何帮助。 谢谢 问题答案: 您的外壳将IO 重定向解释为IO 重定向。Shell打开该文件作为命令的标准输出,并将参数传递给命令。 引用参数以避免这种情况:

  • 我正在尝试从groovy中使用shell命令< code > notify-send-t 2000 " Title " " Message " ,以下一种方式< code > " notify-send-t 2000 \ " Title \ " \ " Message \ "。execute()就可以完美地工作了。但是当我试图用表达代替信息时,似乎什么都不管用。下面是代码片段: 能帮我理解一下吗?

  • 问题内容: 我想从C调用Python脚本,并传递脚本中所需的一些参数。 我要使用的脚本是mrsync或多播远程同步。我通过调用以下命令从命令行进行了工作: -m是包含目标ip地址的列表。-s是包含要同步的文件的目录。-t是目标计算机上将放置文件的目录。 到目前为止,通过使用以下C程序,我设法运行了没有参数的Python脚本: 这很好。但是,我找不到如何将这些参数传递给方法的方法。 问题答案: 似乎