首页 > 解决方案 > Python和环境变量不起作用

问题描述

在 Ubuntu 上的 Docker 容器中,我正在运行一个.sh调用python3 my_script_file.py. 在那个文件中,我这样做:

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

标签: pythonlinux

解决方案


这可能是因为范围export仅限于它正在运行的当前 shell。这意味着只有subprocess运行的 shell 才能看到这个环境变量。

如果你想让这个环境变量全局公开,并且考虑到你是从某种 linux 机器上运行的,我建议你/etc/environmentKEY=VALUE.

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

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也将文本打印到标准输出。为了使其静音,使其行为更类似于 shell 附加 ( >>),请将标准输出路由到/dev/null.


推荐阅读