编写调用含positional arguments等多类型参数Python脚本的Bash包装脚本
编写Bash包装脚本传递完整参数给Python脚本
基础Bash包装脚本(wrapper.sh)
直接使用"$@"即可完整传递所有参数,包括位置参数、命名参数和布尔flags:
#!/bin/bash python3 example.py "$@"
关键说明
#!/bin/bash:指定脚本使用Bash解释器执行"$@":特殊变量,会原样保留用户传入的所有参数——不管是位置参数(如a)、带值的命名参数(如--named_argument custom)还是布尔flag(如--flag),每个参数都会被正确传递给Python脚本,不会出现参数拆分、空格丢失或flag失效的问题。
测试示例
对应你的example.py,可以用以下命令验证:
- 仅传递位置参数:
./wrapper.sh a
输出:
a default False
- 传递位置参数+命名参数:
./wrapper.sh b --named_argument myvalue
输出:
b myvalue False
- 传递所有类型参数:
./wrapper.sh a --flag --named_argument testflag
输出:
a testflag True
针对Pip包的优化方案
如果目标是做成可分发的命令行pip包,更规范的方式是使用Python的entry points机制,无需手动维护Bash脚本:
- 修改
example.py,将主逻辑封装为main函数:
import argparse def run(positional_argument, named_argument='default', flag=False): print(positional_argument) print(named_argument) print(flag) def main(): parser = argparse.ArgumentParser() parser.add_argument('positional_argument', type=str, choices=['a','b']) parser.add_argument('--named_argument', type=str, required=False, default='default') parser.add_argument('--flag', action='store_true') args = parser.parse_args() run(positional_argument=args.positional_argument, named_argument=args.named_argument, flag=args.flag) if __name__ == '__main__': main()
- 在
setup.py中配置entry points:
from setuptools import setup setup( name="your-package-name", version="0.1.0", py_modules=["example"], entry_points={ "console_scripts": [ "your-cli-command=example:main", ], }, )
用户安装包后,直接在终端输入your-cli-command就能调用,参数传递逻辑和直接运行Python脚本完全一致,比如:
your-cli-command b --flag --named_argument package-test
内容的提问来源于stack exchange,提问作者Johannes Wiesner
相关产品推荐
相关产品推荐

