通过Python为当前终端会话设置环境变量

问题描述 投票:0回答:2

我正在尝试编写一个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

python shell environment-variables
2个回答
0
投票

您缺少的是对 UNIX 进程模型的理解。在类 UNIX 操作系统(包括 Linux)中,某些属性与特定进程相关联,例如交互式 shell。这些属性包括 CWD(当前工作目录)和环境变量等内容。进程不能直接更改不同进程的属性(例如环境变量)。当您启动一个新进程时,它通常会继承当前进程的环境变量的副本。因此,当您运行 Python 程序时,就会启动一个新进程。当您修改该进程的环境变量时,它不会影响其父进程(您的 shell)的环境变量。环境变量不是“全局”的。根据定义,你想要做的事情是不可能的。


0
投票

您可以在脚本中设置它,但您不会在该脚本中看到它的效果。 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' )
© www.soinside.com 2019 - 2024. All rights reserved.