从 bash 脚本向 python 传递参数

Posted

技术标签:

【中文标题】从 bash 脚本向 python 传递参数【英文标题】:Pass arguments to python from bash script 【发布时间】:2018-03-03 23:58:57 【问题描述】:

我一直在编写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 脚本?提前致谢!

【问题讨论】:

当然,在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 传递参数的主要内容,如果未能解决你的问题,请参考以下文章

从 Shell 脚本向 Python 传递参数

如何将参数从 bash 传递到 php 脚本?

创建函数-----------(向函数传递数组从函数返回数组)

如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

Shell 传递参数

Shell 传递参数