将python函数转换为命令行接口

hashbang的Python项目详细描述


哈什邦

构建状态pypi#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()

安装

hashbang可以从pip安装

python3 -m pip install hashbang[completion]

这还将包括argcomplete它为hashbang的自动完成提供动力。完成功能是可选的;如果要排除它,请使用pip install hashbang安装

快速入门示例

让我们从一些例子开始。

简单,无参数脚本
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
$pwd.py
$ pwd.py
/home/mauricelam/code/hashbang
<详细内容>

函数的返回值被打印到标准输出。

在这个简单的例子中,使用hashbang获得的附加值是帮助消息,以及在提供意外参数时的用法消息。

$pwd.py—帮助
$ pwd.py --help
usage: pwd.py [-h]

optional arguments:
  -h, --help  show this help message and exit
<详细内容>

位置参数(nargs='?'

@commanddefls(dir=None):returnos.listdir(path=dir)
$ls.py
$ ls.py
bin
etc
home
usr
var
<详细内容>
$ls.py bin
$ ls.py bin
cp
df
echo
mkdir
mv
pwd
rm
<详细内容>

多位置参数(nargs=none

@commanddefcp(src,dest):shutil.copy2(src,dest)
$cp.py textfile.txt复制文本文件.txt
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
0 <详细内容>

可变位置参数(nargs='*'

#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
1
$echo.py hello world
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
2 <详细内容>

布尔标志(默认为False)(action="store_true"

#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
3
$pwd.py
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
4 <详细内容>
$pwd.py—解析符号链接
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
5 <详细内容>

布尔标志(默认为真)(action='store_false')

#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
6
$echo.py hello world&;echo'。
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
7 <详细内容>
$echo.py--不使用newline hello world&;echo'。
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
8 <详细内容>

关键字参数(action='store'

#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
9
$echo-e'a,b,c,d\ne,f,g,h'cut.py--字段"1,2,3"--delimeter=','
python3 -m pip install hashbang[completion]
0 <详细内容>

备忘单

<表><广告>参数类型 python语法 命令行示例 argparse等效值 < /广告><正文>位置(无默认值)def func(foo)command.py foonargs=无 位置(默认值)def func(foo=none)command.py foonargs='?'< /代码>变量位置def func(*foo)命令.py foo bar baznargs='*'变量位置(命名为\\u rements\def func(*u余数)nargs=argparse.rements仅限关键字(默认为false)def func(*,foo=false)command.py--fooaction='存储为真'仅限关键字(默认为true)def func(*,foo=true)command.py—nofooaction='存储错误'仅限关键字(其他默认类型)def func(*,foo='bar')command.py—foo值action='存储'var关键字def func(**kwargs)在hashbang中不允许

有关完整的API,请参见API参考Wiki页面。

命令委派

hashbang.subcommands函数可用于创建命令链,如git branch

python3 -m pip install hashbang[completion]
1
$git.py分支
python3 -m pip install hashbang[completion]
2 <详细内容>
$git.py branch你好
python3 -m pip install hashbang[completion]
3 <详细内容>
$git.py日志
python3 -m pip install hashbang[completion]
4 <详细内容>

自定义命令删除程序

如果子命令不足以满足您的目的,您可以使用@command.delegator装饰符。它的用法与@commanddecorator相同,但实现函数必须在另一个命令上调用.execute(_rements\u),或者引发nomatchingdelegate异常。

python3 -m pip install hashbang[completion]
5
$who.py
python3 -m pip install hashbang[completion]
6 <详细内容>
$who.py我是
python3 -m pip install hashbang[completion]
7 <详细内容>
$who.py—打印死亡进程
python3 -m pip install hashbang[completion]
8 <详细内容>
$who.py您是谁
python3 -m pip install hashbang[completion]
9 <详细内容>

当使用常规的@命令时,decorator在这种情况下仍然可以工作,但是tab completion和help消息将是错误的。

使用@command.delegator
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
0
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
1 <详细内容>
使用@命令
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
2 <详细内容>

参数自定义

可以使用@命令中的参数类进一步自定义参数。

例如,可以在参数中添加别名。

#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
3
$echo.py hello world&;echo'。
#!/usr/bin/env python3fromhashbangimportcommand@commanddefecho(message):print(message)if__name__=='__main__':echo.execute()
7 <详细内容>
$echo.py-n hello world&;echo'。
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
5 <详细内容>
或者,也可以选择使用pep 3107中定义的参数注释语法指定参数
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
6 <详细内容>< Buff行情>

有关完整的参数api,请参见https://github.com/mauricelam/hashbang/wiki/api reference\argument

帮助消息

命令的帮助消息直接取自函数的docstring。此外,参数中的帮助参数可用于记录每个参数。docstring中前缀为用法:(不区分大小写)的段落用作用法消息。

#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
7
$git.py——帮助
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
8 <详细内容>
$git.py——不存在
#!/usr/bin/env python3importosfromhashbangimportcommand@commanddefpwd():returnos.getcwd()if__name__=='__main__':pwd.execute()
9 <详细内容>

制表符完成

设置

hashbang还提供了tab completion功能,由argcomplete提供支持。由于argcomplete是hashbang的一个可选依赖项,因此您可以使用

python3 -m pip install hashbang[completion]

安装后,要注册制表符完成命令,请运行

$ pwd.py
/home/mauricelam/code/hashbang
1

或者,激活全局completeion对于所有命令,请按照ArgComplete文档中的"全局完成"部分中的一次性设置说明进行操作,然后将字符串"python argcomplete"添加到文件顶部作为注释(在"之后)!行)。

指定选项

使用制表符补全的最简单方法是通过参数中的选项参数构造函数。

$ pwd.py
/home/mauricelam/code/hashbang
2
$apt_get.py<;tab>;
$ pwd.py
/home/mauricelam/code/hashbang
3
$ pwd.py
/home/mauricelam/code/hashbang
4
$ pwd.py
/home/mauricelam/code/hashbang
5 <详细内容>

使用完成符

如果提前(在执行之前)不知道这些选项,或者预计算成本太高,则可以为参数指定一个完成符。

$ pwd.py
/home/mauricelam/code/hashbang
6
$cp.py<;tab>;
$ pwd.py
/home/mauricelam/code/hashbang
7
$ pwd.py
/home/mauricelam/code/hashbang
8 <详细内容>

退出代码

与普通的python程序一样,设置退出代码的首选方法是使用sys.exit()。默认情况下,对于运行时不引发异常的函数,将返回退出代码0,或者使用help打印帮助消息。如果函数引发异常,则结果代码为1。如果函数使用sys.exit()退出,则会保留的退出代码。

此外,如果要根据引发的异常返回不同的退出代码,也可以在异常处理程序中调用sys.exit()。有关示例,请参见测试/扩展/自定义退出代码.py

进一步阅读

有关进一步的阅读,请查看wiki页面。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何序列化数字?   java如何用我的Mainclass扩展ListActivity类和Fragment类?   JavaJersey、Jackson和JAXRS发布了多种JSON格式   java如何使用JavaFXKeyCombination覆盖系统默认的键盘快捷键,如Ctrl+C、Ctrl+V?   java Jersey类路径扫描示例Jersey。配置。服务器供应商。类路径   java什么样的数据结构可以作为一个数组,但在同一索引下给定多个值时会自动增长到第二维度?   java如何序列化非持久实体中的嵌套PersistentEntityResource   协议缓冲区我可以让protoc在Java中生成int数组吗?   在GregorianCalendar ArrayList Java中添加日期元素   从html模板动态生成pdf文件并用java生成目录   java Gridgain 6.5.5开源多个节点速度较慢。。?   java如何检查数组中所有整数的不相等性?   java在Eclipse中,如何多次运行JUnit测试用例   java侦听器不能处理特定的片段   java不是一个声明?(蓝色J)   找不到Attributer类型的PersonId的java定义