$ 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
,它可以按照您的期望。