我正在尝试编写一个基于用户输入设置环境变量的python脚本。我可以通过键入常规导出myVar='value'在终端中手动设置env变量。如果我键入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')
我开始了。所以操作系统正常工作。但为什么它不想设置一个变量呢?
我认为这是一个python限制os我尝试了bascript
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(当前工作目录(和环境变量。进程不能直接更改不同进程的属性(例如env-vars(。当您启动一个新进程时,它通常会继承当前进程的env-var的副本。因此,当您运行Python程序时,将启动一个新进程。当您修改该进程的env vars时,它不会影响其父进程(您的shell(的env var。Env-var不是";全球";。根据定义,你想做的是不可能的。
您可以在脚本中设置它,但在该脚本中看不到它的效果。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' )