Python 和环境变量不起作用



在 Ubuntu 上的 Docker 容器中,我正在运行一个调用python3 my_script_file.py.sh文件。 在该文件中,我执行以下操作:

commands = []
commands.append("export OMP_NUM_THREADS=4")
commands.append("echo $OMP_NUM_THREADS")

然后,我使用以下命令执行命令数组:

def execute_commands_list(commands, no_bash_script = False):
for command in commands:
if not no_bash_script and gc.output_to_bash_script:
write_command_to_bash_script(command)
else:
print("     [  " + command + "  ]")
ret = subprocess.call(command, shell=True, executable="/bin/bash")
assert ret==0 or ret==2, "bash return code error: " + str(ret) + " " + command

这是输出:

[  export OMP_NUM_THREADS=4  ]
[  echo $OMP_NUM_THREADS  ]

(这是一个空行(。 我自己执行后尝试在终端中运行 echo $OMP_NUM_THREADS,但一无所获。 但是,如果我手动运行这两个命令,则会设置 env var。

(我也尝试过os.environ,但也失败了(

我错过了什么?

(作为参考,.sh文件是:(

#!/bin/bash -p
python3 my_script_file.py

这可能是因为export的范围仅限于运行它的当前 shell。这意味着只有运行subprocess的 shell,此环境变量才会可见。

如果你想使这个环境变量全局公开,并且考虑到你从某种 linux 机器上运行,我建议以KEY=VALUE的格式将其编写为/etc/environment

例如,在您的情况下,而不是

export OMP_NUM_THREADS=4

将其替换为:

echo OMP_NUM_THREADS=4 >> /etc/environment

注意!由于environment位于/etc下,因此它的权限很有可能设置为仅允许写入sudo用户,因此请确保将其包含在subprocess调用中。

您可以使用如下所示的内容:

echo 'OMP_NUM_THREADS=4' | sudo tee -a /etc/environment > /dev/null

tee也会将文本打印到标准输出。为了使它静音,使其行为更类似于外壳附加(>>(,将标准输出路由到/dev/null

最新更新