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

Posted

技术标签:

【中文标题】如何将库的 Python 函数作为 Bash 命令提供?【英文标题】:How could Python functions of a library be made available as Bash commands? 【发布时间】:2015-06-23 04:13:51 【问题描述】:

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

首先,不考虑 Bash 命令选项和参数,如何使用一个单词 Bash 命令获得包含多个函数的 Python 文件的函数?我不想通过命令“套件”的命令获得这些功能。所以,假设我在这个 Python 文件中有一个名为 zappo 的函数(比如,名为 library1.py)。我想使用像 zappo 这样的单字 Bash 命令调用这个函数,notlibrary1 zappo 这样的。

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

【问题讨论】:

你知道所有函数的名称吗?还是您想让bash 开始搜索python 文件以找到其中包含命令的文件? 你好。感谢您对此的想法。我倾向于运行一个 Python 脚本来更改 Bash 环境,以便使用单个命令在 Bash 环境中使用 Python 脚本中定义的一组函数。 编写短脚本来执行此操作很常见。 zappo 可以是导入library1 并调用函数的python 脚本。这是可以的还是被禁止的“命令套件”的一部分? 规范的方法是创建使用 argparse 的 CLI 脚本。如果您的代码在包中,setuptools 可以自动为您的函数创建 CLI entry_points @d3pd:您不能从子 shell 修改 bash 环境。当然,您可以使用 python 程序生成一个 bash 脚本文件,但您仍然需要在 bash 初始化中安排该文件的源代码。 【参考方案1】:

是的,但答案可能并不像您希望的那么简单。无论你做什么,你都必须在你的 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 &gt; ~/pyliases。然后,每次您登录/启动新的终端会话时,您的环境都会更新。只需编辑您的 python 函数文件,然后 . ~/.bashrc 即可使用这些函数。

【讨论】:

以上是关于如何将库的 Python 函数作为 Bash 命令提供?的主要内容,如果未能解决你的问题,请参考以下文章

如何将库的本地副本添加和编译到 Android React Native 模块中?

使用 Bash 修复 Python 库的 PATH

PHP的命令行扩展Readline相关函数学习

PHP的命令行扩展Readline相关函数学习

将 IPython 变量作为参数传递给 bash 命令

使用 WIFE Java 库的 SWIFT MT 消息解析