通过python脚本设置shell环境变量

时间:2016-08-16 19:05:31

标签: python bash shell

我有一些需要环境变量的工具,我想从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"
  4.   

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

3 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:2)

只要你从同一个过程中启动“乐器”(我想要的一个剧本)它应该可以工作:

In [1]: os.putenv("VARIABLE", "123")

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

您无法更改其他流程或父流程的环境变量。

答案 2 :(得分:0)

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

  

环境示例:

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