如何将库的 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 命令调用这个函数,not 像 library1 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 > ~/pyliases
。然后,每次您登录/启动新的终端会话时,您的环境都会更新。只需编辑您的 python 函数文件,然后 . ~/.bashrc
即可使用这些函数。
【讨论】:
以上是关于如何将库的 Python 函数作为 Bash 命令提供?的主要内容,如果未能解决你的问题,请参考以下文章