为什么python中设置的环境变量不能持久存在?

phy*_*ael 40 python persistence environment-variables

我希望通过在我将执行某些模拟代码的任何目录中运行脚本来编写一个python脚本来创建一些适当的环境变量,并且我已经读过我不能写一个脚本来使这些env变量持续存在mac os终端.所以有两件事:

这是真的?

这似乎是一件有用的事情; 一般来说为什么不可能?

Ben*_*son 32

你无法从python中做到这一点,但一些聪明的bash技巧可以做类似的事情.基本原因是:环境变量存在于每进程内存空间中.使用fork()创建新进程时,它继承其父级的环境变量.在shell中设置环境变量(例如bash)时,如下所示:

export VAR="foo"
Run Code Online (Sandbox Code Playgroud)

你正在做的是告诉bash将其进程空间中的变量VAR设置为"foo".当你运行一个程序时,bash使用fork()然后使用exec()来运行程序,所以从bash运行的任何东西都会继承bash环境变量.

现在,假设您要创建一个bash命令,该命令使用当前目录中名为".data"的文件中的内容设置一些环境变量DATA.首先,您需要有一个命令来从文件中获取数据:

cat .data
Run Code Online (Sandbox Code Playgroud)

打印数据.现在,我们要创建一个bash命令来在环境变量中设置该数据:

export DATA=`cat .data`
Run Code Online (Sandbox Code Playgroud)

该命令获取.data的内容并将其放入环境变量DATA中.现在,如果你把它放在别名命令中,你有一个bash命令来设置你的环境变量:

alias set-data="export DATA=`cat .data`"
Run Code Online (Sandbox Code Playgroud)

您可以将该别名命令放在主目录中的.bashrc或.bash_profile文件中,以便在您启动的任何新bash shell中使用该命令.


dbr*_*dbr 20

一种解决方法是输出export命令,让父shell评估这个.

thescript.py:

import pipes
import random
r = random.randint(1,100)
print("export BLAHBLAH=%s" % (pipes.quote(str(r))))
Run Code Online (Sandbox Code Playgroud)

..和bash别名(在大多数shell中也可以这样做..甚至tcsh!):

alias setblahblahenv="eval $(python thescript.py)"
Run Code Online (Sandbox Code Playgroud)

用法:

$ echo $BLAHBLAH

$ setblahblahenv
$ echo $BLAHBLAH
72
Run Code Online (Sandbox Code Playgroud)

您可以输出任意shell代码,包括多个命令,如:

export BLAHBLAH=23 SECONDENVVAR='something else' && echo 'everything worked'
Run Code Online (Sandbox Code Playgroud)

只记得要小心逃避任何动态创建的输出(pipes.quote模块对此有好处)


Ste*_*ini 5

如果您在 python 脚本(或任何其他脚本或程序)中设置环境变量,它不会影响父 shell。

编辑澄清:所以你的问题的答案是肯定的,这是真的。但是,您可以从 shell 脚本中导出并使用点调用来获取它

在 fooexport.sh 中

export FOO="bar"
Run Code Online (Sandbox Code Playgroud)

在命令提示符下

$ . ./fooexport.sh
$ echo $FOO
bar
Run Code Online (Sandbox Code Playgroud)