从 bash 脚本向 python 传递参数
Posted
技术标签:
【中文标题】从 bash 脚本向 python 传递参数【英文标题】:Pass arguments to python from bash script 【发布时间】:2018-03-03 23:58:57 【问题描述】:我一直在编写bash
和python
脚本的混合脚本。 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 脚本?提前致谢!
【问题讨论】:
当然,在python中一次循环。无需为每个参数调用相同的 python 脚本 那么如何将所有参数传递给 python 脚本?@RomanPerekhrest 通过分隔符分隔的字符串或json字符串 在 bash 中将参数传递给 python:pythonscript.sh $@,然后使用“import sys print sys.argv[0]”作为 python 中的第一个参数,依此类推。你可以在python中循环。 @Ardit,必须是"$@"
,而不是纯 $@
,否则您将拆分空格,扩展名称中的文字 glob,否则不会完全按照接收到的方式传递输入。
【参考方案1】:
您的文件 tinify.py
应以以下内容开头(如果您有两个参数):
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--
没问题。将 args 传递给 python 脚本的方式与 bash 脚本相同。如果你打电话给tinify.py test1.jpg
sys.argv[1] 将是“test1.jpg”。如果您想要可变数量的 args,您可以使用 len(sys.argv)
计算 args 在 bash 脚本中,我认为您可以使用“$@”传递所有 args。取自this答案【参考方案2】:
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 语法引用包含空格的参数。
【讨论】:
你明白我的问题吗?我不知道如何将所有参数从 bash 脚本传递给 python。 你明白我的回答吗?您可以编写 Python 部分,以便 shell 可以传递任意数量的参数,例如:python tinify.py $@
,如果您不想接触这些参数。【参考方案3】:
你在tinify.sh
中使用$@
#!/bin/bash
tinify.py "$@"
在 Python 脚本中消除重复项以将它们从 shell 中过滤掉会容易得多。 (当然,这引发了您是否需要一个 shell 脚本的问题。)
【讨论】:
我同意消除重复项在 Python 中效果更好。我同意这里使用 bash 脚本真的很肤浅。然而,这在之前的 cmets 中已经指出。 OP 询问如何过滤 bash 中的参数。不在 Python 中。 我认为有时使用./tinify.sh test1.jpg test2.jpg
比使用python tinify.py test1.jpg test2.jpg
更方便,尽管它们都对我很有效。有没有其他方便的方法来调用它们?
如果您将#!/usr/bin/python
(或任何适当的)添加到Python 脚本并使其可执行,您可以简单地运行./tinify.py test1.jpg test2.jpg
。【参考方案4】:
除了上面切普纳的回答:
#!/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 中不能包含重复值)。
【讨论】:
remove_duplicates(sys.argv[1:])
以上是关于从 bash 脚本向 python 传递参数的主要内容,如果未能解决你的问题,请参考以下文章
创建函数-----------(向函数传递数组从函数返回数组)