自定义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文件;我正在使用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
。
【参考方案1】:
$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.'
。
【讨论】:
谢谢。自己是 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多个参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章