自定义 bash 函数不馈送 python 多个参数



问题:

我正在编写一个基于链接在python中执行操作的程序,并可能扩展它以执行其他操作。该程序旨在通过bash快速使用。因此,我正在使用自定义函数来执行此操作。

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

至于蟒蛇文件;我正在使用sysosre来使其正常工作。sys,为了同时使用sys.exit()var = sys.argv[<argNum>],前者是为了使用自定义异常(如error.searchError()error.usageError()(退出程序,而后者是为了使用命令本身的参数来实现。os只适合os.system('{}'.format(<your command here>)).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解释器,以打开<python program path here>,这是程序实际路径的占位符。至于$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类包含该程序的所有海关错误,好吗?好的,所以你明白了,但是这些功能有什么作用? 当参数 1 根本不存在时,将引发usageError,并将使用信息打印到终端。然后sys.exit()程序,基本上相当于在视频游戏中点击 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> $@}

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

您要查找的是$@符号。此值代表所有参数。

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

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

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

我建议将您的查询括在引号中。例如youtube -s "something cool".

最新更新