zoukankan      html  css  js  c++  java
  • 解决 Flask 项目无法用 .env 文件中解析的参数设置环境变量的错误

    在 Windows 上启动 Flask 项目时,工作目录有 UTF-8 编码的 .env 文件,里面配置的环境变量在 Python2 中识别为 Unicode 类型,导致下述错误:

     * Serving Flask app "bootstrap" (lazy loading)
     * Environment: development
     * Debug mode: on
     * Restarting with stat
    Traceback (most recent call last):
      File "bootstrap.py", line 40, in <module>
        app.run(host=str(settings.DEV_HOST), port=settings.DEV_PORT)
      File "D:Python27libsite-packagesflaskapp.py", line 943, in run
        run_simple(host, port, self, **options)
      File "D:Python27libsite-packageswerkzeugserving.py", line 812, in run_simple
        reloader_type)
      File "D:Python27libsite-packageswerkzeug\_reloader.py", line 275, in run_with_reloader
        sys.exit(reloader.restart_with_reloader())
      File "D:Python27libsite-packageswerkzeug\_reloader.py", line 132, in restart_with_reloader
        close_fds=False)
      File "D:Python27libsubprocess.py", line 172, in call
        return Popen(*popenargs, **kwargs).wait()
      File "D:Python27libsubprocess.py", line 394, in __init__
        errread, errwrite)
      File "D:Python27libsubprocess.py", line 644, in _execute_child
        startupinfo)
    TypeError: environment can only contain strings

    遇到这种情况,只需对 werkzeug 项目做个小的修改即可。Diff 文件如下所示:

    diff --git a/werkzeug/_reloader.backup.py b/werkzeug/_reloader.py
    # index 0d23dba..2698040 100644
    # --- a/_reloader.backup.py
    # +++ b/_reloader.py
    # @@ -117,16 +117,20 @@ class ReloaderLoop(object):
    #          while 1:
    #              _log('info', ' * Restarting with %s' % self.name)
    #              args = _get_args_for_reloading()
    # -            new_environ = os.environ.copy()
    # -            new_environ['WERKZEUG_RUN_MAIN'] = 'true'
    # +            old_environ = os.environ.copy()
    # +            new_environ = {
    # +                'WERKZEUG_RUN_MAIN': 'true'
    # +            }
    # 
    #              # a weird bug on windows. sometimes unicode strings end up in the
    #              # environment and subprocess.call does not like this, encode them
    #              # to latin1 and continue.
    #              if os.name == 'nt' and PY2:
    # -                for key, value in iteritems(new_environ):
    # +                for key, value in iteritems(old_environ):
    #                      if isinstance(value, text_type):
    # -                        new_environ[key] = value.encode('iso-8859-1')
    # +                        new_environ[key.encode('iso-8859-1')] = value.encode('iso-8859-1')
    # +                    else:
    # +                        new_environ[key] = value
    # 
    #              exit_code = subprocess.call(args, env=new_environ,
    #                                          close_fds=False)
    

      

  • 相关阅读:
    [转] RISC-V架构介绍
    SiP封装成超越摩尔定律的要塞,日月光/安靠/长电科技谁将赢取IC封装的未来
    OLED中的Demura
    第四次工业革命:人工智能(AI)入门
    星座图的原理与应用
    示波器基本原理之七:示波器的基本测量
    示波器基本原理之六:示波器的基本控制
    示波器基本原理之五:采集模式
    示波器基本原理之四:波形捕获率
    png的故事:隔行扫描算法
  • 原文地址:https://www.cnblogs.com/shishaochen/p/10014818.html
Copyright © 2011-2022 走看看