问题:
我正在编写一个基于链接在python中执行操作的程序,并可能扩展它以执行其他操作。该程序旨在通过bash快速使用。因此,我正在使用自定义函数来执行此操作。
function youtube() {python3 <youtube program path here> $1}
至于蟒蛇文件;我正在使用sys
、os
和re
来使其正常工作。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
,$2
Hi
,$3
this
等等...
您要查找的是$@
符号。此值代表所有参数。
但是,仅仅插入$@
而不是$1
并不能解决您的所有问题。 在你的 Python 脚本中,每个参数都会被空格再次分解,就像 bash 函数一样。
要解决此问题,您可以在标志后面的文本周围加上引号,如下所示:youtube -s 'Hi this is a test.'
。
如果你这样称呼你的程序:youtube -s something cool
,那么sys.argv[2]
将是"某物"。
我建议将您的查询括在引号中。例如youtube -s "something cool"
.