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

如何将bash shell内的变量传递到调用它的Python脚本中

实现方案

内嵌bash脚本向外层Python传值,最适配你当前代码结构的方案是通过标准输出传递带固定标识的变量值,无需复杂的进程间通信配置,改造成本极低:

  • 在bash脚本所有退出逻辑前,输出带唯一固定前缀的变量内容,和普通运行日志做区分
  • Python侧实时捕获bash的标准输出流,一边正常打印运行日志,一边识别前缀提取start、end变量

修改后完整代码

核心改动点都做了兼容处理,不影响原有脚本的功能逻辑:

#!/usr/bin/python3
import sys
import subprocess

if len(sys.argv) > 1:
    n = sys.argv[1]
else:
    print("启动参数错误,示例:python3 count.py enp35s0")
    sys.exit(1)

# 存储bash传回的变量
bash_vars = {
    "start": None,
    "end": None
}

def capture():
    # 逐行读取bash输出,兼顾实时日志打印和变量提取
    proc = subprocess.Popen(
        ['/bin/bash', '-c', bash, n],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        text=True,
        bufsize=1
    )
    for line in proc.stdout:
        line = line.strip()
        # 原样打印所有bash运行日志
        print(line)
        # 识别固定前缀提取变量
        if line.startswith("###VAR_START:"):
            bash_vars["start"] = int(line.split(":",1)[1])
        if line.startswith("###VAR_END:"):
            bash_vars["end"] = int(line.split(":",1)[1])
    proc.wait()
    if proc.returncode != 0:
        raise subprocess.CalledProcessError(proc.returncode, proc.args)


bash = '''
#!/usr/bin/env bash
INTERVAL="1"
n=$1

start=1
end=2

# 统一封装传值+关机逻辑,所有退出分支均调用,避免漏传变量
shutdown_with_vars() {
    echo "###VAR_START:$start"
    echo "###VAR_END:$end"
    /sbin/shutdown -h now
}

while [[ $start -le $end ]]
do
    ((start = start + 1))

    R1=`cat /sys/class/net/$n/statistics/rx_bytes`
    T1=`cat /sys/class/net/$n/statistics/tx_bytes`
    sleep $INTERVAL
    R2=`cat /sys/class/net/$n/statistics/rx_bytes`
    T2=`cat /sys/class/net/$n/statistics/tx_bytes`
    TBPS=`expr $T2 - $T1`
    RBPS=`expr $R2 - $R1`
    TKBPS=`expr $TBPS / 1024`
    RKBPS=`expr $RBPS / 1024`
    echo "TX $1: $TKBPS kB/s RX $1: $RKBPS kB/s"

    SUM=$(expr $RKBPS)

    if (( $SUM >= 10 ));then
        ((i = 0))
        echo "Connection is active:"
    fi

    now=$(( $SUM ))
    max=$((sum>max?sum:max))
    if [ $now -gt $max ] ; then
        max=$now
    fi

    wget -q --spider http://example.com
    if [ $? -eq 0 ]; then
        echo "Online"
        ((no_internet = 0 ))
    else
        no_internet=$(( no_internet+1 ))
    fi

    if [ $no_internet -gt 10 ] ; then
        echo "off"
        shutdown_with_vars
    fi

    echo "The SUM is: $SUM"
    echo "The maximum download bandwidth is: $max"
    echo $start "Seconds" 'of' $end "Seconds until end"

done
shutdown_with_vars
'''

capture()

# 直接获取bash传回的两个变量
start = bash_vars["start"]
end = bash_vars["end"]

# 后续可直接使用start、end变量编写业务逻辑

关键说明
  • 变量标识前缀###VAR_可自行修改,只要保证和bash脚本中其他普通日志的开头不重复,即可保证解析零错误
  • 原代码中通过字符串拼接把网卡名n写入bash脚本的写法存在命令注入风险,修改后通过bash位置参数$1传递网卡参数,无需处理特殊字符转义,安全性更高
  • 统一的传值+关机函数覆盖了断网触发关机、计时结束触发关机两个退出分支,保证所有场景下Python都能拿到变量值
  • 逐行读取输出流的实现方式,保留了原有脚本实时打印网速、在线状态的效果,和修改前的运行日志输出完全一致

内容的提问来源于stack exchange,提问作者user19127009

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:15:47