【发布时间】:2020-04-01 15:20:06
【问题描述】:
问题:
我正在编写一个基于链接在 python 中执行操作的程序,并可能将其扩展为做更多的事情。该程序旨在通过 bash 快速使用。所以,我正在使用自定义函数来做到这一点。
function youtube() {python3 <youtube program path here> $1}
至于python文件;我正在使用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 类包含该程序的所有海关错误,好吗?好的,你明白了,但是这些函数有什么作用呢? 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 <youtube program path here> $1; } -
oguz ismail 无论哪种方式都可以。理想吗?前者。两者都行不通。
youtube -s 'foo bar'仍然是No search query provided。