【问题标题】:How do I access environment variables in Python?如何访问环境变量值
【发布时间】:2011-06-21 20:59:51
【问题描述】:

我设置了一个我想在我的 Python 应用程序中访问的环境变量。我如何获得它的价值?

【问题讨论】:

    标签: python environment-variables


    【解决方案1】:

    在单行代码中使用嵌套 for-loops 的棘手之处在于您必须使用列表推导。因此,为了打印所有您的环境变量,而无需导入外部库,您可以使用:

    python -c "import os;L=[f'{k}={v}' for k,v in os.environ.items()]; print('\n'.join(L))"
    

    【讨论】:

      【解决方案2】:

      已编辑 - 2021 年 10 月

      根据@Peter 的评论,您可以通过以下方式对其进行测试:

      main.py

      #!/usr/bin/env python
      
      
      from os import environ
      
      # Initialize variables
      num_of_vars = 50
      for i in range(1, num_of_vars):
          environ[f"_BENCHMARK_{i}"] = f"BENCHMARK VALUE {i}"  
      
      def stopwatch(repeat=1, autorun=True):
          """
          Source: https://stackoverflow.com/a/68660080/5285732
          stopwatch decorator to calculate the total time of a function
          """
          import timeit
          import functools
          
          def outer_func(func):
              @functools.wraps(func)
              def time_func(*args, **kwargs):
                  t1 = timeit.default_timer()
                  for _ in range(repeat):
                      r = func(*args, **kwargs)
                  t2 = timeit.default_timer()
                  print(f"Function={func.__name__}, Time={t2 - t1}")
                  return r
              
              if autorun:
                  try:
                      time_func()
                  except TypeError:
                      raise Exception(f"{time_func.__name__}: autorun only works with no parameters, you may want to use @stopwatch(autorun=False)") from None
              
              return time_func
          
          if callable(repeat):
              func = repeat
              repeat = 1
              return outer_func(func)
          
          return outer_func
      
      @stopwatch(repeat=10000)
      def using_environ():
          for item in environ:
              pass
      
      @stopwatch
      def using_dict(repeat=10000):
          env_vars_dict = dict(environ)
          for item in env_vars_dict:
              pass
      
      python "main.py"
      
      # Output
      Function=using_environ, Time=0.216224731
      Function=using_dict, Time=0.00014206099999999888
      

      如果这是真的……使用dict() 比直接访问environ 快1500 倍。


      以性能为导向的方法 - 调用 environ 的成本很高,因此最好调用一次并将其保存到字典中。完整示例:

      from os import environ
      
      
      # Slower
      print(environ["USER"], environ["NAME"])
      
      # Faster
      env_dict = dict(environ)
      print(env_dict["USER"], env_dict["NAME"])
      

      P.S- 如果您担心暴露私有环境变量,请在分配后清理 env_dict

      【讨论】:

      • 谢谢你,彼得,我已经更新了我的答案
      【解决方案3】:

      导入os 模块:

      import os
      

      获取环境变量:

      os.environ.get('Env_var')
      

      设置环境变量:

      # Set environment variables
      os.environ['Env_var'] = 'Some Value'
      

      【讨论】:

        【解决方案4】:

        你也可以试试这个:

        首先,安装python-decouple

        pip install python-decouple
        

        将其导入您的文件中

        from decouple import config
        

        然后获取环境变量

        SECRET_KEY=config('SECRET_KEY')
        

        阅读有关 Python 库的更多信息here

        【讨论】:

          【解决方案5】:

          对于 Django,请参阅Django-environ

          $ pip install django-environ
          
          import environ
          
          env = environ.Env(
              # set casting, default value
              DEBUG=(bool, False)
          )
          # reading .env file
          environ.Env.read_env()
          
          # False if not in os.environ
          DEBUG = env('DEBUG')
          
          # Raises Django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
          SECRET_KEY = env('SECRET_KEY')
          

          【讨论】:

          • 解释一下。什么是上下文 - 代码在什么上下文中执行?在有 Django 的服务器上?在本地进行测试?别的地方?想法是什么?代码应该完成什么?
          【解决方案6】:

          还有许多很棒的图书馆。例如,Envs 将允许您从 rad 环境变量中解析对象。例如:

          from envs import env
          env('SECRET_KEY') # 'your_secret_key_here'
          env('SERVER_NAMES',var_type='list') #['your', 'list', 'here']
          

          【讨论】:

          • “这是 rad” 中的“rad”是什么意思? rad - “1.(俚语)部首剪裁;优秀”
          【解决方案7】:

          其实可以这样实现:

          import os
          
          for item, value in os.environ.items():
              print('{}: {}'.format(item, value))
          

          或者简单地说:

          for i, j in os.environ.items():
              print(i, j)
          

          查看参数中的值:

          print(os.environ['HOME'])
          

          或者:

          print(os.environ.get('HOME'))
          

          设置值:

          os.environ['HOME'] = '/new/value'
          

          【讨论】:

          • 不,这个答案确实没有在现有答案之上添加任何内容
          • 这应该被删除,它是其他答案的重复。 str.format 只是一个花哨的补充。
          • >>> import os, pprint; pprint.pprint(list(os.environ.items()))
          • 第一个答案是整个环境的可读输出,谢谢。为了在 PyCharm 调试器中查看环境,我评估 {k: v for k,v in sorted(os.environ.items())}
          • 它增加了如何设置值
          【解决方案8】:

          如果您打算在生产 Web 应用程序代码中使用该代码,使用任何 Web 框架(如 DjangoFlask),请使用像 envparse 这样的项目。使用它,您可以将值读取为您定义的类型。

          from envparse import env
          # will read WHITE_LIST=hello,world,hi to white_list = ["hello", "world", "hi"]
          white_list = env.list("WHITE_LIST", default=[])
          # Perfect for reading boolean
          DEBUG = env.bool("DEBUG", default=False)
          

          注意:kennethreitz 的autoenv 是用于制作项目特定环境变量的推荐工具。对于使用autoenv 的用户,请注意将.env 文件保密(公众无法访问)。

          【讨论】:

            【解决方案9】:

            至于环境变量:

            import os
            print os.environ["HOME"]
            

            【讨论】:

              【解决方案10】:

              您可以使用访问环境变量

              import os
              print os.environ
              

              尝试查看 PYTHONPATH 或 PYTHONHOME 环境变量的内容。也许这会对您的第二个问题有所帮助。

              【讨论】:

                【解决方案11】:

                环境变量通过os.environ访问

                import os
                print(os.environ['HOME'])
                

                或者您可以使用以下命令查看所有环境变量的列表:

                os.environ
                

                有时您可能需要查看完整列表!

                # using get will return `None` if a key is not present rather than raise a `KeyError`
                print(os.environ.get('KEY_THAT_MIGHT_EXIST'))
                
                # os.getenv is equivalent, and can also give a default value instead of `None`
                print(os.getenv('KEY_THAT_MIGHT_EXIST', default_value))
                

                Windows 上的Python default installation 位置是C:\Python。如果您想在运行 python 时找出答案,可以这样做:

                import sys
                print(sys.prefix)
                

                【讨论】:

                • 您好,感谢您对“默认安装”的有效回复;从有效的角度快速理解它而不是通过链接。我真的很感激 :) 但关于我的 (1) 问题,请查看下面的命令和输出 sn-p: >>> import os >>> print os.environ['PYTHONPATH'] Traceback(最近一次调用最后一次):文件“”,第 1 行,在 文件“C:\Python25\lib\os.py”,第 435 行,在 getitem 中 return self.data[key.upper() ] KeyError: 'PYTHONPATH' >>> print os.environ.get('PYTHONPATH') None >>> // PLZ to be continue...//
                • 第一种方式脚本抛出异常,而第二种方式给出无。那么,有没有办法让它有意义的价值,还是我做错了???阿米特。
                • os.environ 是一本字典。尝试访问字典中不存在的键将引发 KeyError。当键不存在时,get 方法简单地返回 None。你有 PYTHONPATH 设置吗?您可以尝试使用保证存在的变量(例如 PATH)吗?它是否返回有意义的值?
                • PYTHONPATH 用于从 Python 外部向 Python (sys.path) 添加新的搜索路径。看看docs.python.org/using/cmdline.html#environment-variables
                • .get() 也可以设置默认值。
                【解决方案12】:

                你应该先导入操作系统使用

                import os
                

                然后实际打印环境变量值

                print(os.environ['yourvariable'])
                

                当然,将 yourvariable 替换为您要访问的变量。

                【讨论】:

                  【解决方案13】:

                  检查密钥是否存在(返回TrueFalse

                  'HOME' in os.environ
                  

                  打印密钥时也可以使用get();如果您想使用默认值,这很有用。

                  print(os.environ.get('HOME', '/home/username/'))
                  

                  /home/username/ 是默认值

                  【讨论】:

                  • 哪个更好,"HOME" in os.environos.environ.get('HOME')
                  • @endolith 他们做不同的事情。第一个返回 True 或 False,而第二个返回一个值,可能是 None。
                  • @endolith,正确的问题应该是 "HOME" in os.environos.environ.get('HOME') is None。正如您首先看到的那样,使用起来更具可读性和舒适性。
                  【解决方案14】:
                  import os
                  for a in os.environ:
                      print('Var: ', a, 'Value: ', os.getenv(a))
                  print("all done")
                  

                  这将打印所有环境变量及其值。

                  【讨论】:

                    【解决方案15】:

                    最初的问题(第一部分)是“如何在 Python 中检查环境变量”。

                    以下是检查是否设置了 $FOO 的方法:

                    try:  
                       os.environ["FOO"]
                    except KeyError: 
                       print "Please set the environment variable FOO"
                       sys.exit(1)
                    

                    【讨论】:

                    • 试试可以更快。 env vars 的情况可能最适合“尝试”:stackoverflow.com/a/1835844/187769
                    • @RandomInsano 更快 =/= 更好。这段代码的可读性不如"if 'FOO' not in os.environ: ..."
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-12-05
                    • 2011-05-28
                    • 2019-12-30
                    相关资源
                    最近更新 更多