$ 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如何处理这种情况感到困惑。有人可以解释一下吗?
答案 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
,这可以达到您所期望的效果。