如何将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
相关产品推荐
相关产品推荐

