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

如何向同文件内的Bash脚本部分传递Python变量

Python变量传递给内嵌Bash脚本实现方法

首选:位置参数安全传参(无注入风险)

这种方式不需要做字符串拼接,不会因为参数带特殊字符导致脚本执行异常,只需要修改两处代码:

  • 调整subprocess.run的参数列表,将Python侧拿到的网卡名n作为Bash脚本的执行参数传入
  • 移除Bash代码段里硬编码的n=enp35s0,改为读取传入的位置参数赋值给n

修改后的完整核心代码如下:

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

n = sys.argv[1]
print(n)


def capture():
    # bash -c 后的参数规则:第一个参数是脚本的$0(一般填shell名占位),后续参数对应$1、$2...
    subprocess.run(["pkexec", '/bin/bash', '-c', bash, "bash", n], check=True)

bash = '''
set -x

INTERVAL="1"  # update interval in seconds

# 读取传入的第一个位置参数,赋值给n
n="$1"

# 统计时长配置
start=1
end=8 # 配置统计运行时长,原注释标注单位为分钟

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 $n: $TKBPS kB/s RX $n: $RKBPS kB/s"
done
'''

capture()

注:原Bash代码里echo输出用的是$1,这里已经改成直接用$n,和前面的网卡路径引用保持一致,避免参数位置错乱。另外Bash段开头的shebang行在通过bash -c执行时不会生效,已经移除。

备选:字符串插值嵌入(仅可信输入场景使用)

如果能完全确定传入的网卡名是合法的系统设备名(仅包含字母、数字、下划线,无空格、引号等特殊字符),也可以直接用Python f-string把变量值嵌入Bash代码段,修改方式更简单:

  • 把Bash字符串的定义改成f字符串(开头加f)
  • 把Bash段里硬编码的n=enp35s0改成n={n},直接把Python变量的值插入进去
# 仅核心修改部分展示
bash = f'''
INTERVAL="1"

# 直接嵌入Python变量n的值
n={n}

# 后续原有Bash逻辑不需要改动
start=1
end=8
# ... 其余代码保持原样
'''

补充说明

  • 优先选第一种位置参数传参的方式,兼容性、安全性更好,不会出现命令注入、特殊字符转义问题
  • 原代码里用expr做算术计算可以替换为Bash原生算术扩展$((计算式)),执行效率更高,比如TBPS=$((T2 - T1)),不修改也不影响原有功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:21:33