You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写调用含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,可以用以下命令验证:

  1. 仅传递位置参数:
./wrapper.sh a

输出:

a
default
False
  1. 传递位置参数+命名参数:
./wrapper.sh b --named_argument myvalue

输出:

b
myvalue
False
  1. 传递所有类型参数:
./wrapper.sh a --flag --named_argument testflag

输出:

a
testflag
True

针对Pip包的优化方案

如果目标是做成可分发的命令行pip包,更规范的方式是使用Python的entry points机制,无需手动维护Bash脚本:

  1. 修改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()
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:24:50