我需要使用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)是一个参数
这里有一个您可能喜欢的替代方案:将其作为单个字符串发送,并将其作为编码的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解码器的内部,我不能说它是否会直接打开任何安全漏洞,但我可以说,您必须小心使用解码的值,以确保不会添加任何自己的值。
希望这能有所帮助。
一个更干净的方法来做你所要求的(主要是如果你需要其他参数)是从另一个参数中识别你的列表并枚举允许的类型(如果需要转换),这看起来像这样:
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的替代方案更好!
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脚本: 这很好。但是,我找不到如何将这些参数传递给方法的方法。 问题答案: 似乎