我正在尝试编写一个Python脚本,根据用户输入设置环境变量。我可以通过键入常规
export myVar='value'
在终端中手动设置环境变量。如果我输入 echo $myVar
我会得到结果 'value'
。到目前为止一切都很好。
我有这个脚本:
import os
os.environ['myVar'] = 'value'
如果我在 python 会话中打印变量,我会看到该变量。但是如果我退出 python 并执行相同的操作
echo $myVar
,我就看不到该变量。
好的,所以该变量只是当前 python 会话的一部分,它实际上并未在终端中执行,所以我尝试了其他方法:
import os
os.system('export myVar=value')
这也没有任何作用。我在终端中没有收到变量。
例如,如果我尝试这个:
import os
os.system('gedit')
我开始使用 gedit。所以
os.system
有效。但为什么它不想设置变量呢?
我认为这是Python的限制,所以我尝试了bashcript
echo "Setting variable"
export myVar='value'
将其保存为 var.sh,使用 chmod +x 使其可执行并使用 ./var.sh 运行它 依然没有。没有变量集。奇怪的是,如果我直接在终端中输入相同的内容,它就会起作用,但不能通过 bash 脚本。 我还在某处看到你必须先获取它。所以我创建了另一个像这样的 bash 脚本:
source var.sh
echo $myVar
仍然没有设置变量。我在这里缺少什么?
我在 popOS 20.04 上使用 python3.8.5
您缺少的是对 UNIX 进程模型的理解。在类 UNIX 操作系统(包括 Linux)中,某些属性与特定进程相关联,例如交互式 shell。这些属性包括 CWD(当前工作目录)和环境变量等内容。进程不能直接更改不同进程的属性(例如环境变量)。当您启动一个新进程时,它通常会继承当前进程的环境变量的副本。因此,当您运行 Python 程序时,就会启动一个新进程。当您修改该进程的环境变量时,它不会影响其父进程(您的 shell)的环境变量。环境变量不是“全局”的。根据定义,你想要做的事情是不可能的。
您可以在脚本中设置它,但您不会在该脚本中看到它的效果。 https://www.howtogeek.com/668503/how-to-set-environment-variables-in-bash-on-linux
#! /usr/bin/env python3
import os
os .system( 'echo MYVAR=value >> ~/.bashrc' )
os .system( 'exec bash' )
如果您想要的话,您稍后会从命令行看到它。
echo $MYVAR
value
恢复:
os .system( "sed -i '/MYVAR=/d' ~/.bashrc" )
os .system( 'unset MYVAR' )