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

时间:2015-04-16 15:59:03

标签: python bash function interface command

假设我有一个庞大的Python函数库,我希望这些函数(或其中一些函数)可以作为Bash中的命令使用。

首先,忽略Bash命令选项和参数,我怎样才能获得包含许多函数的Python文件的函数来使用单个单词Bash命令运行?我不希望通过命令套件的命令提供这些功能。所以,让我们说我在这个Python文件中有一个名为zappo的函数(比如称为library1.py)。我想使用像zappo这样的单字Bash命令调用此函数,不是类似library1 zappo

其次,如何处理选项和参数?我认为一个很好的方法是捕获Bash命令的所有选项和参数,然后在函数级别```中使用docopt解析*在Python函数中使用它们。

1 个答案:

答案 0 :(得分:0)

是的,但答案可能并不像你希望的那么简单。无论你做什么,你都必须在你的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中的谓词更改为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即可使用这些函数。