如何使库的 Python 函数作为 Bash 命令提供



假设我有一个大型的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函数即可使用。

相关内容

  • 没有找到相关文章

最新更新