从bash脚本传递参数到python

时间:2017-09-22 11:51:45

标签: python linux bash shell

我一直在处理bashpython脚本的脚本混合。 bash脚本可以接收未知的计数输入参数。例如:

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脚本?提前致谢!

4 个答案:

答案 0 :(得分:3)

您在$@

中使用tinify.sh
#!/bin/bash
tinify.py "$@"

要消除Python脚本中要从shell中过滤掉的重复项,要容易得多。 (当然,这引发了一个问题,你是否需要一个shell脚本。)

答案 1 :(得分:3)

除了Chepner上面的回答:

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

在python脚本中,tinify.py:

from sys import argv
inputArgs = sys.argv[1:]
def remove_duplicates(l):
    return list(set(l))
arguments=remove_duplicates(inputArgs)

列表arguments将包含传递给python脚本的参数(重复删除,因为set不能在python中包含重复的值)。

答案 2 :(得分:1)

python程序可以使用sys.argv接受任意数量的命令行参数 - 只需记住sys.argv[0]是脚本的名称 和实际参数包含在sys.argv[1:]

$ 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语法引用包含空格的参数。

答案 3 :(得分:0)

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

import sys

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

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