我有一些需要环境变量的工具,我想从python代码自动设置。所以我尝试了几种方法来实现它,但它们都没有成功。 以下是一些例子:
我在我的python脚本中插入以下代码
import os
os.system("export ENV_VAR=/some_path")
我创建了bash脚本(env.sh)并从python中运行它:
#!/bin/bash
export ENV_VAR=some_path
#call it from python
os.system("source env.sh")
是否可以使用python设置(导出)环境变量,即 没有直接将其导出到shell?
答案 0 :(得分:9)
设置环境变量仅为当前进程及其启动的任何子进程设置它。因此,使用os.system
将仅为正在运行的shell设置它以执行您提供的命令。当该命令完成时,shell会消失,环境变量也会消失。使用os.putenv
或os.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*e
或subprocess.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"})