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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:53:24