【问题标题】:Proper way of using environment variables (passed from shell/terminal) in python code [closed]在python代码中使用环境变量(从shell/终端传递)的正确方法[关闭]
【发布时间】:2019-06-14 13:00:44
【问题描述】:

我有一个 bash shell 脚本(在 Ubuntu 18.04 上运行),它读取一些输入(文件或用户)并根据输入为几个(环境)变量分配不同的值。该脚本启动一个程序(python),然后在不同的执行点,需要环境变量已分配的值。

到目前为止我使用的一般方法是这样的

# shell script
[...]
export VAR_A = value1
export VAR_B = value2
python program.py
[...]

程序由几个类组成,这些类有时需要脚本中设置的值。

# class1.py, used by program.py
import helper
[...]
var_a = helper.get_var_a()
var_b = helper.get_var_b()
[...]

帮助类用于实际读取环境变量。

# helper.py
[...]
import os
def get_var_a():
    return os.environ["VAR_A"]

代码做正确的事。然而,它看起来并不“好”,我怀疑它是否遵循任何最佳实践。我想要或正在寻找的是一种读取环境变量一次并将它们存储在程序变量中的方法。大致如下:

# helper.py
# [...]
import os
ENVIRONMENT = { "VAR_A" : os.environ["VAR_A"], "VAR_B" : os.environ["VAR_B"] }
[...]

并得到它:

# class1.py
var_a = helper.ENVIRONMENT["VAR_A"]

问题: 这(上面的 sn-p)是一个更好或更坏的方法:

  • 可读性/可维护性
  • 代码执行/效率
  • 还有其他更优化或“pythonic”的替代方案吗?

【问题讨论】:

  • 看起来你正在尝试重写 os.environ :)
  • 实际上可以说更好让程序稍后使用os.environ 检索环境变量 - 因为在此期间变量可能已经改变,而您想要使用最新版本
  • os.environ 已包含进程已读取的环境变量。通过在其上添加另一本字典,您有什么收获?

标签: python bash environment-variables


【解决方案1】:

读取一次环境变量并将它们存储在程序的变量中” - 这已经完成了。

环境变量保存在进程的环境块中。在 python 中,当os 模块被初始化时,这些被复制到字典os.environ 中。访问环境块的方式是不可移植的,python 为我们提供了保护。

有特定的python代码用于在字典更新时添加和删除环境变量以及更新环境块。

所以再复制一份也没有意义。

可读性/可维护性 - 使用 另一个 变量名会引起混淆。更糟糕的是,如果您在代码开头复制环境变量然后更改它们,则副本和os.environ 将不同步。任何新值都不会在环境块中,也不会传播到子进程。

代码执行/效率 - 保存相同数据的两个副本总是效率较低。这是否会产生很大的开销取决于os.environ 的大小。

还有其他更优化或“pythonic”的替代方案吗?是的,使用os.environ

【讨论】:

    【解决方案2】:

    helper.py:

    import os
    ENVIRONMENT = os.environ
    

    test.py =

    import helper
    print(helper.ENVIRONMENT["hello"])
    

    测试:

    export hello="world"; python test.py
    

    打印:

    world
    

    ...基本上你正在尝试创建一个已经实现的对象:os.environ

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2017-06-07
      • 2021-11-19
      相关资源
      最近更新 更多