假设我有一个大型的Python函数库,我希望这些函数(或其中的一些函数)在Bash中作为命令提供。
首先,不考虑 Bash 命令选项和参数,我如何获得包含多个函数的 Python 文件的函数,以使用单个单词 Bash 命令运行?我不想通过命令"套件"的命令提供这些功能。所以,假设我在这个 Python 文件中有一个名为 zappo
的函数(比如说,叫做 library1.py
)。我想使用像 zappo
这样的单字 Bash 命令调用这个函数,而不是像 library1 zappo
这样的东西。
第二,如何处理选项和论点?我在想一个不错的方法是捕获 Bash 命令的所有选项和参数,然后在函数级别使用docopt
解析 *''在 Python 函数中使用它们。
是的,但答案可能没有你希望的那么简单。无论你做什么,你都必须在你的 bash shell 中为你想要运行的每个函数创建一些东西。但是,您可以让 Python 脚本生成存储在获取源的文件中的别名。
这是基本思想:
#!/usr/bin/python
import sys
import __main__ #<-- This allows us to call methods in __main__
import inspect #<-- This allows us to look at methods in __main__
########### Function/Class.Method Section ##############
# Update this with functions you want in your shell #
########################################################
def takesargs():
#Just an example that reads args
print(str(sys.argv))
return
def noargs():
#and an example that doesn't
print("doesn't take args")
return
########################################################
#Make sure there's at least 1 arg (since arg 0 will always be this file)
if len(sys.argv) > 1:
#This fetches the function info we need to call it
func = getattr(__main__, str(sys.argv[1]), None)
if callable(func):
#Actually call the function with the name we received
func()
else:
print("No such function")
else:
#If no args were passed to this function, just output a list of aliases for this script that can be appended to .bashrc or similar.
funcs = inspect.getmembers(__main__, predicate=inspect.isfunction)
for func in funcs:
print("alias {0}='./suite.py {0}'".format(func[0]))
显然,如果您在类中使用方法而不是在 main 中使用函数,请将引用从 __main__
更改为您的类,并将检查中的谓词更改为 inspect.ismethod
。此外,您可能希望对别名等使用绝对路径。
示例输出:
~ ./suite.py
alias noargs='./suite.py noargs'
alias takesargs='./suite.py takesargs'
~ ./suite.py > ~/pyliases
~ echo ". ~/pyliases" >> ~/.bashrc
~ . ~/.bashrc
~ noargs
doesn't take args
~ takesargs blah
['./suite.py', 'takesargs', 'blah']
如果您使用我上面建议的方法,您实际上可以让 .bashrc 在从文件中获取别名之前运行~/suite.py > ~/pyliases
。然后,每次登录/启动新的终端会话时,您的环境都会更新。只需编辑您的 python 函数文件,然后. ~/.bashrc
函数即可使用。