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脚本,这是一个列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章
python使用subprocess.Popen运行bat脚本时报不支持输入重新定向错误分析
为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?