Pass arguments to python from bash script
我一直在研究bash和python脚本的混合脚本。bash脚本可以接收未知的count输入参数。例如:
1
| tinify.sh test1.jpg test2.jpg test3.jpg ..... |
在bash接收到所有的参数之后,它将这些参数传递给tinify.py。现在我有两种方法可以做到这一点。
在bash中循环并调用python tinify.py testx.jpg。
换言之,python tinify test1.jpg,然后python tinify test2.jpg,最后是python tinify test3.jpg。
将所有参数传递给tinify.py,然后在python中循环。
但有一个问题,我想过滤同一个参数,比如用户输入tinify.sh test1.jpg test1.jpg test1.jpg,我只需要tinify.sh test1.jpg,所以我觉得第二种方法比较容易,因为python可能比较方便。
如何将所有参数传递给python脚本?事先谢谢!
- 当然,在python中立即循环。不需要为每个参数调用相同的python脚本
- 那么,如何将所有参数传递给python脚本呢?@罗曼佩雷克勒斯
- 通过分隔符分隔的字符串或JSON字符串
- 在bash:pythonscript.sh$@中将参数传递给python,然后将"import sys print sys.argv[0]"用于python中的第一个参数,依此类推。您可以在python中循环。
- @阿迪特,你能举例说明吗?
- @Ardit,需要是"$@",而不是裸露的$@,或者您正在拆分空格,扩展名称中的文字全局,或者不按接收到的方式传递输入。
除了上述切普纳的回答之外:
1 2
| #!/bin/bash
tinify.py"$@" |
在python脚本中,tinify.py:
1 2 3 4 5
| from sys import argv
inputArgs = sys.argv[1:]
def remove_duplicates(l):
return list(set(l))
arguments=remove_duplicates(inputArgs) |
列表arguments将包含传递给python脚本的参数(由于set不能包含python中的重复值而删除了重复的参数)。
- remove_duplicates(sys.argv[1:])
在tinify.sh中使用$@。
1 2
| #!/bin/bash
tinify.py"$@" |
在python脚本中消除从shell中过滤出来的重复项要容易得多。(当然,这就提出了一个问题,您是否需要一个shell脚本。)
- 我同意消除重复是在Python中更好地完成的。我同意这里使用bash脚本是非常肤浅的。然而,这已经在前面的评论中指出了。操作询问如何过滤bash中的参数。不是在Python。
- 我认为有时使用./tinify.sh test1.jpg test2.jpg比使用python tinify.py test1.jpg test2.jpg更方便,尽管它们对我都很好。有没有其他方便的方法来调用它们?
- 如果向python脚本中添加#!/usr/bin/python(或任何适当的内容),并使其可执行,则只需运行./tinify.py test1.jpg test2.jpg。
python程序可以接受任意数量的命令行参数,使用sys.argv—只要记住sys.argv[0]是脚本的名称。实际论点包含在sys.argv[1:]中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ cat test_args.py
from sys import argv
prog_name = argv[0]
print('Program name:', prog_name)
for arg in argv[1:]:
print(arg)
$ python test_args.py a b 'c d'
Program name: test_args.py
a
b
c d
$ |
注意,包含空格的参数必须根据shell语法引用。
- 你明白我的问题吗?我不知道如何将所有参数从bash脚本传递到python。
- 你明白我的答案吗?您可以编写python部分,以便shell可以传递任意数量的参数,例如:python tinify.py $@,如果您不想接触这些参数。
您的文件tinify.py应该以以下开头(如果您有两个参数):
1 2 3
| import sys
arg1, arg2 = sys.argv[1], sys.argv[2] |
sys.argv[0]是脚本本身的名称。当然,您可以循环访问sys.argv。就我个人而言,我喜欢将所有的参数作为JSON对象传递,因此之后我将执行json.loads()
- 那么,如何传递到python脚本呢?
- 对于唯一参数tinify.sh test1.jpg test1.jpg test1.jpg应该变成tinify.sh test1.jpg的问题,可以使用一个集合。例如set([sys.argv[i] for i in range(your_number_of_args)])。
- 非常感谢@con--
- 没问题。以与bash脚本相同的方式将参数传递给python脚本。如果您调用tinify.py test1.jpgsys.argv[1]将是"test1.jpg"。如果您想要一个可变数量的参数,您可以在bash脚本中使用len(sys.argv)计算参数,我认为您可以使用"$@"传递所有参数。摘自这个答案