Python和Bash Command Line Env var的处理不同



$ 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

在外壳中,我与python有所不同:

$ test = 4;Echo $ test

4

但是:

$ test = 2
$ test = 4 Echo $ test

2

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

这就是外壳和环境变量之间的区别。

在这里,

test=4 python test.py

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

test=4; python test.py

创建一个仅在当前外壳会话中可用的壳变量(这就是为什么您从shell获得值的原因,也不会传播到环境中。

使一个变量环境变量使所有子过程都继承了变量,即使该变量在过程的环境中可用,任何POSIX shell上的通常方法是export变量:

export test=4; python test.py

在您的上一个情况下:

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

在运行echo之前发生的可变test的扩展。

您需要使用某种方法来保存膨胀以供以后进行:

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

您需要导出python的变量。

$ export test=4

然后执行您的Python脚本:

$ ./test.py

这个...

test=4 python test.py

...是一个python命令,在其环境中明确设置了可变的test,而此...

test=4; python test.py

...是两个单独的命令。第一个告诉Bash在当前Shell中设置变量test(不标记为导出(,第二个是python命令。自然,Python不会在其环境中看到变量。但是,如果您之后做

echo $test

然后 shell (不是 echo command(在处理命令行时将变量引用扩展到其值。由此产生的扩展命令是

echo 4

,它可以按照您的期望。

最新更新