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

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

问题描述:

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

import os 
os.system("export ENV_VAR=/some_path") 
  • 我创建bash脚本(env.sh)

    1. 我插入下面的代码,并从蟒蛇运行:

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

    是否有可能设置(出)口环境变量使用python,即 没有直接出口它的壳呢?

  • +0

    这是 “工具”,从python脚本中正在启动? –

    +0

    是的,这是因为这个原因,我还需要改变我的PATH env var。 –

    +0

    无论使用什么语言编写,所有进程都有一个环境块 - 您不需要shell。当您fork()'时,环境块(默认情况下)会从父级复制到子级 - 它们在任何其他时间都不会被复制。 – cdarke

    只要你启动“仪器”,从同样的过程(脚本我认为)应该工作:

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

    你不能改变一个不同的进程或父的环境变量处理。

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

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

    您将有更好的运气在shell脚本中设置变量。如果你的脚本是source(这样它就会在shell的当前实例中运行,而不是在子shell中运行),那么脚本结束后它们将保持设置状态。

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

    环境例如:

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