自定义bash函数不提供python多个参数[重复]

Posted

技术标签:

【中文标题】自定义bash函数不提供python多个参数[重复]【英文标题】:Custom bash function not feeding python multiple args [duplicate] 【发布时间】:2020-04-01 15:20:06 【问题描述】:

问题:

我正在编写一个基于链接在 python 中执行操作的程序,并可能将其扩展为做更多的事情。该程序旨在通过 bash 快速使用。所以,我正在使用自定义函数来做到这一点。

function youtube() python3 <youtube program path here> $1

至于python文件;我正在使用sysosre 以使其发挥作用。 sys,为了同时使用sys.exit()var = sys.argv[&lt;argNum&gt;],前者是为了使用自定义异常退出程序,例如error.searchError()error.usageError(),而后者是为了使用命令本身的参数来实现. os 仅适用于 os.system(''.format(&lt;your command here&gt;))re 用于从我的问题所在的第二个参数中删除空格,并根据query = re.sub(' ', '+', query) 将它们替换为“+”。

现在,至于问题本身。正如我之前提到的,问题在于第二个 bash 参数,即sys.argv[2]sys.argv[0] 是 python 文件,sys.argv[1] 是选项,在这种情况下是 -s

sys.argv[2] 是实际的 youtube 搜索查询。但是,每当我使用带有所有三个参数的命令时,youtube -s Hi this is a test.,根据我犯的自定义错误,我得到以下输出:No search query provided!。这只发生在 python 排除 IndexError 时,这意味着程序没有从 bash 或 zsh 接收第二个参数。当第二个参数确实存在时,实际应该发生的是:

os.system('open https://www.youtube.com/results?search_query=Hi+this+is+a+test.')

在我的默认浏览器中打开该链接。我尝试将$2 添加到自定义函数中,以及通过python 源本身输入第二个参数的各种方式,包括使用x = input('Search Query: ') 语句。但这不是我正在做的最佳选择。

代码:

以下是我刚才打出来的所有废话的源代码。

自定义函数:

function youtube() python3 <python program path here> $1

对于那些不知道这意味着什么的人(即;对 bash 编码不太了解(或任何事情)的人); function 方法创建一个 bash 对象,在本例中为 youtube()。至于括号()中的代码,这里使用函数python3,它只是将参数0中的程序推送到python 3.x解释器,打开&lt;python program path here&gt;,这是实际路径的占位符的程序。至于$1,这是一个变量,总是等于函数名后面输入的文本。

自定义错误:

class error:

    def usageError():
        usageError = '''Usage: youtube [-s] [<search_query>]
Help: Performs actions related to https://www.youtube.com
Options:
        -s              Opens https://www.youtube.com/results?search_query=<your query here>'''

        print(usageError)
        sys.exit()

    def searchError():
        searchError = 'No search query provided!'

        print(searchError)
        sys.exit()

这无关紧要吗?我不确定,但我还是把它放进去!现在,如果你不明白,下面应该解释一下。

error 类包含该程序的所有海关错误,好吗?好的,你明白了,但是这些函数有什么作用呢? usageError 在参数 1 根本不存在时引发,并将使用信息打印到终端。然后sys.exit()s这个程序,基本上相当于在电子游戏中按Alt+f4。另一方面,searchError 仅在参数 2 不存在时发生,这意味着没有搜索查询。然后它会告诉您您很愚蠢,并且需要实际输入您的查询才能使其工作。

嗯,也许不是那么准确,但你明白了。

多汁位:

option = ''

try: option = sys.argv[1];
except IndexError: raise error.usageError()

if option == '-s':

    try:
        query = sys.argv[2]
        query = re.sub(' ', '+', query)
        os.system('open https://www.youtube.com/results?search_query='.format(query))
    except IndexError: raise error.searchError();

只是为了解释;首先,程序创建变量option,然后将其设置为空字符串。然后,它尝试将选项设置为参数 1 或选项。如果参数 1 不存在,则会引发错误 error.usageError,如自定义错误中所述。之后,程序尝试创建变量query,并将其设置为参数2,然后将查询中的所有空格替换为“+”号。如果所有这些都成功发生,它会在您的默认浏览器中加载 youtube 搜索。如果不是,则会引发错误error.searchError()

编辑

编辑 1. 错误出现在自定义函数中。我应该有一个$@,我有一个$1。正如 Jeshurun Roach 在他的回答中解释的那样,$1 仅持有论点 1,而没有其他论点。而$@ 包含所有变量。

function youtube() python3 <python program path here> $@

【问题讨论】:

function 的正确语法:function youtube python3 &lt;youtube program path here&gt; $1; oguz ismail 无论哪种方式都可以。理想吗?前者。两者都行不通。 youtube -s 'foo bar' 仍然是No search query provided 【参考方案1】:

$1 指的是传递给函数的第一个参数。在 bash 中,空格分隔参数。所以在你的例子中youtube -s Hi this is a test.$1-s, $2Hi, $3this 等等...

您正在寻找的是$@ 符号。该值代表所有参数。

但是仅仅插入$@ 而不是$1 并不能解决您的所有问题。在您的 python 脚本中,每个参数将再次被空格分隔,就像 bash 函数一样。

要解决此问题,您可以在标志后的文本周围加上引号,如下所示:youtube -s 'Hi this is a test.'

【讨论】:

谢谢。自己是 bash 的新手,但我很清楚函数方法是如何工作的。只是不知道$@ 我在if option == '-s':的try语句中添加了这个:try: test = sys.argv[3]; query = query + test; qNum = 3; while True: qNum += 1; try: query = query + sys.argv[qNum]; except IndexError: break; except IndexError: pass; 您也可以使用它来获取python中的搜索查询。 query = '+'.join(sys.argv[2:])【参考方案2】:

如果你这样调用你的程序:youtube -s something cool,那么sys.argv[2] 将是“某物”。

我建议将您的查询用引号括起来。例如youtube -s "something cool"

【讨论】:

以上是关于自定义bash函数不提供python多个参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python基础篇第2篇: Python自定义函数

Python:初始函数

Python Python 函数

python之函数

Python的函数有哪些?

Python的函数一