如何从Bash导出环境变量至Python?及命令行参数的Python实现
Hey,我来帮你搞定这个Bash和Python脚本间变量传递的问题~先理清楚你的场景和遇到的问题:
问题场景与报错回顾
你想在Linux服务器上拆分脚本逻辑:用Bash处理Linux专属命令,Python处理复杂逻辑,尝试通过Bash导出环境变量给Python脚本时遇到了NameError。你的测试脚本和报错如下:
测试脚本1.sh(Bash)
#!/bin/bash test_var="Test Variable" export test_var echo "1.sh has been executed" python 2.sh
测试脚本2.sh(Python)
#!/usr/bin/env python3 print("The python script has been invoked successfully") print(test_var)
执行./1.sh后出现的报错:
$ ./1.sh 1.sh has been executed The python script has been invoked successfully Traceback (most recent call last): File "2.sh", line 4, in <module> print(test_var) NameError: name 'test_var' is not defined
另外你提到习惯用Bash的$1、$2位置变量,已经找到用Python的sys.argv的方案,这里我再详细梳理几种可行的变量传递方法,帮你更灵活地处理不同场景。
错误原因分析
Bash导出的环境变量不会自动变成Python的全局变量哦!你直接在Python里写print(test_var),相当于引用了一个从未定义的Python变量,自然会抛出NameError。Python需要通过特定的方式读取系统环境变量。
可行解决方案
方法1:读取Bash导出的环境变量(对应你最初的思路)
修改Python脚本,导入os模块,从环境变量字典中读取:
#!/usr/bin/env python3 import os print("The python script has been invoked successfully") # 用get()方法读取,变量不存在时返回None,避免KeyError print(os.environ.get('test_var')) # 如果确定变量一定存在,也可以直接用os.environ['test_var']
这样执行./1.sh就能正常输出Test Variable了。
方法2:命令行参数传递(你找到的sys.argv方案)
如果是像Bash的$1、$2这种位置参数,用命令行传递是最直接的方式。修改Bash脚本把变量作为参数传给Python:
#!/bin/bash test_var="Test Variable" echo "1.sh has been executed" # 把变量作为参数传递给Python脚本,注意加双引号避免空格拆分 python 2.sh "$test_var"
然后Python脚本这样写:
#!/usr/bin/env python3 import sys print("The python script has been invoked successfully") # sys.argv[0]是脚本自身的路径,sys.argv[1]是第一个传入的参数 if len(sys.argv) > 1: print(sys.argv[1]) else: print("No arguments provided")
如果要传递多个参数也很方便:
# Bash里传递多个变量 python 2.sh "$var1" "$var2" "$var3"
Python里对应用sys.argv[1]、sys.argv[2]、sys.argv[3]分别获取。
方法3:标准输入传递(适合大量/多行数据)
如果要传递的是多行文本或者大量数据,用管道通过标准输入传递更合适:
Bash脚本:
#!/bin/bash test_var="Test Variable" echo "1.sh has been executed" # 把变量内容通过管道传给Python echo "$test_var" | python 2.sh
Python脚本:
#!/usr/bin/env python3 import sys print("The python script has been invoked successfully") # 读取标准输入的内容,strip()去掉首尾的换行和空格 data = sys.stdin.read().strip() print(data)
内容的提问来源于stack exchange,提问作者Georgi Stoyanov
相关产品推荐
相关产品推荐

