【问题标题】:Set shell environment variable via python script通过python脚本设置shell环境变量
【发布时间】:2016-12-23 06:51:12
【问题描述】:

我有一些需要环境变量的仪器,我想从 python 代码中自动设置它。所以我尝试了几种方法来实现它,但都没有成功。 以下是一些示例:

  1. 我在我的 python 脚本中插入以下代码

    import os
    os.system("export ENV_VAR=/some_path")
    
  2. 我创建了 bash 脚本(env.sh)并从 python 运行它:

    #!/bin/bash
    export ENV_VAR=some_path
    
    #call it from python
    os.system("source env.sh")
    
  3. 我也试过 os.putenv()os.environ["ENV_VAR"] = "some_path"

是否可以使用 python 设置(导出)环境变量,即 不直接导出到shell?

【问题讨论】:

  • 这个“工具”是从 python 脚本中启动的吗?
  • 是的,正因为如此,我还需要更改我的 PATH 环境变量。
  • 所有进程都有一个环境块,不管它们是用哪种语言编写的——你不需要外壳。当您fork() 时,环境块(默认情况下)从父级复制到子级 - 它们不会在任何其他时间复制。

标签: python bash shell


【解决方案1】:

设置环境变量只为当前进程和它启动的任何子进程设置它。因此,使用os.system 将仅为正在运行的shell 设置它以执行您提供的命令。当该命令完成时,shell 会消失,环境变量也会消失。使用os.putenvos.environ 设置它具有类似的效果;为 Python 进程及其任何子进程设置了环境变量。

我假设您正在尝试为启动脚本的 shell 或全局设置这些变量。这是行不通的,因为 shell(或其他进程)不是您设置变量的 Python 脚本的子脚本。

在 shell 脚本中设置变量会更好。如果您随后 source 该脚本(以便它在 shell 的当前实例中运行,而不是在子 shell 中运行),那么它们将在脚本结束后保持设置。

【讨论】:

    【解决方案2】:

    只要您从同一个过程中启动“仪器”(我想是一个脚本),它就应该可以工作:

    In [1]: os.putenv("VARIABLE", "123")
    
    In [2]: os.system("echo $VARIABLE")
    123
    

    您不能更改不同进程或父进程的环境变量。

    【讨论】:

      【解决方案3】:

      根据您执行仪器的方式,您可能能够专门为子进程更改环境而不影响父进程。请参阅 os.spawn*esubprocess.Popen 的文档,它们接受表示子环境的单独参数。例如,Replacing the os.spawn familysubprocess 模块文档中提供了两种用法:

      环境示例:

      os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
      ==>
      Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
      

      【讨论】:

        【解决方案4】:

        一个shell函数可以做到这一点。您需要打印您的导出语句并对其进行评估。

        set_shell_env() {
            output=$(python print_export_env.py $*)
            eval $output
        }
        

        【讨论】:

        • 这个问题的唯一好答案!这里的其他男女只是试图教育提问者。没有人问是非……我们只想在python中设置env变量……有什么好理解的?!
        • 除了它应该是"$@",而不是$*——现在参数在空格上被分词并扩展为glob。同样,eval "$output",而不是 eval $output
        猜你喜欢
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 2019-05-17
        • 1970-01-01
        • 2013-02-06
        • 2015-07-26
        相关资源
        最近更新 更多