Python和Bash命令行env变量处理不同?

时间:2017-04-20 03:31:05

标签: python bash environment-variables

$ cat test.py

#!/usr/bin/env python
# coding=utf-8
import os
print (os.environ.get('test'))

$ test = 4 python test.py

4

$ test = 4; python test.py

None

虽然在shell中我与python有所不同:

$ test = 4; echo $ test

4

但是:

$ test = 2
$ test = 4 echo $ test

2

所以我对python和bash如何处理这种情况感到困惑。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:2)

这是shell和环境变量之间的区别。

下面,

test=4 python test.py

test=4传递给python的环境,因此您将在脚本中获取变量test

尽管

test=4; python test.py

创建一个只在当前shell会话中可用的shell变量(这就是你从shell获取值的原因),即不会传播到环境中。

要创建一个变量环境变量,以便所有子进程都继承变量,即在进程环境中使变量可用,任何POSIX shell上的常用方法是export变量:

export test=4; python test.py

在你的最后一个案例中:

$ test=2
$ test=4 echo $test
2

test内置运行之前发生变量echo的扩展。

您需要使用某种方法来保留扩展以供日后使用:

$ test=2
$ test=4 sh -c 'echo $test'
4

答案 1 :(得分:1)

您需要导出Python的变量。

$ export test=4

然后执行你的Python脚本:

$ ./test.py

答案 2 :(得分:1)

这......

test=4 python test.py

...是一个python命令,在其环境中明确设置变量test,而这......

test=4; python test.py

...是两个单独的命令。第一个告诉bash在当前shell中设置变量test(不标记它以便导出),第二个是python命令。当然,Python不会在其环境中看到变量。但如果你以后做了

echo $test

然后 shell (不是echo command)在处理命令行时将变量引用扩展为其值。生成的扩展命令是

echo 4

,这可以达到您所期望的效果。