关于linux:从bash脚本传递参数到python

Pass arguments to python from bash script

我一直在研究bashpython脚本的混合脚本。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脚本?事先谢谢!


除了上述切普纳的回答之外:

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中的重复值而删除了重复的参数)。


tinify.sh中使用$@

1
2
#!/bin/bash
tinify.py"$@"

在python脚本中消除从shell中过滤出来的重复项要容易得多。(当然,这就提出了一个问题,您是否需要一个shell脚本。)


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语法引用。


您的文件tinify.py应该以以下开头(如果您有两个参数):

1
2
3
import sys

arg1, arg2 = sys.argv[1], sys.argv[2]

sys.argv[0]是脚本本身的名称。当然,您可以循环访问sys.argv。就我个人而言,我喜欢将所有的参数作为JSON对象传递,因此之后我将执行json.loads()