【问题标题】:How to set environment variables in virtualenv如何在 virtualenv 中设置环境变量
【发布时间】:2019-02-26 05:02:58
【问题描述】:

如果我有像这样激活 virtualenv 的 python 脚本:

#!/path/to/venv/bin/python

如何在不修改此脚本的情况下为该脚本设置变量?

我希望此环境变量对使用此 virtualenv 的所有脚本有效。

这意味着修改这个脚本不是解决方案,因为有二十个脚本,我不想修改二十个脚本。

围绕 python 脚本编写一个 shell 包装脚本会起作用,但我想避免这种情况。

过去我认为自定义sitecustomize.py 可用于启动代码。但是 Ubuntu(AFAIK 是唯一这样做的发行版)带有自己的 sitecustomize.py 文件,效果是我的 sitecustomize.py 没有被调用。见https://bugs.launchpad.net/ubuntu/+source/python2.5/+bug/197219

以下是我想如何使用 virtualenv 的一些方法:

(我又考虑过了。我想设置变量不是python或virtualenv的工作。我需要一种统一的方式来设置环境变量。就我而言,我想在不使用shell的情况下做到这一点包装器)。

【问题讨论】:

  • 用于激活virtualenv的activate脚本(在virtual env的bin目录下)可能是设置环境变量的地方。所有 python 脚本都应该继承这些,但从维护的角度来看,它可能不是一个好选择,因为如果你设置了一个新的 virtualenv,你必须记住再次修改激活脚本。
  • @AbhinavUpadhyay 如果我在问题的代码行中调用解释器,那么激活 shell 脚本不会被执行。
  • @OliverRadini 您提到的问题不适用。 AFAIK这些问题通过在(shell)脚本中设置环境变量来解决这个问题,该脚本在python解释器启动之前执行。在我的问题中,解释器被称为“#!/path/to/venv/bin/python”我无法编写包装外壳脚本。
  • 啊,我明白了,谢谢;对困惑感到抱歉。我现在会在那里留下我的评论,以防有人想要更多关于不会解决问题的信息

标签: python virtualenv


【解决方案1】:

如何在 Ubuntu 中操作

Ubuntu的问题似乎python包带有PYTHONNOUSERSITE作为cPython编译标志。您可以使用 site module 找到它,并看到 site.ENABLE_USER_SITE 设置为 False。

问题的具体问题

tl;dr #!/path/to/venv/bin/python 不足以执行您的虚拟环境。

虽然其余答案在某些情况下似乎是正确的,但问题的问题是他用#!/path/to/venv/bin/python 强制执行,但他的问题中没有提供任何上下文虚拟环境,所以我想他是之前没有激活他的虚拟环境来运行他的脚本。

这是没用的,因为该命令通常链接到您的系统 python 可执行文件[^1] 并执行更多操作。此外,默认情况下,如果您不使用source /path/to/venv/bin/activate 激活虚拟环境或配置 apache 或 nginx 来管理您的 venv,您将使用系统环境变量。

venv环境变量的解决方案

然后,可以在 venv/bin/activate 脚​​本中添加特定的行,以 bash 语言添加环境值:

export FOO=BAR

然后使用source 命令激活它。


[^1]:您可能会更喜欢通用的#!/usr/bin/env python3(不推荐使用python2)。环境将正确地接受您的可执行文件。

【讨论】:

    【解决方案2】:

    在尝试了dotenv 包以及.pth 方法后,我发现它们对我不起作用。所以,我只是修改了venv/bin/activate 脚本,并在那里导出了变量。

    这就是想法。

    $ cat venv/bin/activate
    
    deactivate () {
        unset FOO
        unset BAR
        ...
    }
    
    ...
    
    export FOO='xxx'
    export BAR='xxx'
    

    【讨论】:

      【解决方案3】:

      在编写sitecustomize.py 文件和更改bin/python 都是可行的解决方案时,我建议另一种不涉及直接更改virutalenv 内容的方法,只需安装一个.pth 文件:

      ./venv/lib/python2.7/site-packages/_set_envs.pth
      

      内容:

      import os; os.environ['FOO'] = 'bar'
      

      测试:

      $ ./venv/bin/python -c "import os; print os.getenv('FOO')"
      bar
      

      诀窍是,python会加载每个.pth文件on startup,如果有一行以importthis line will be get executed开头,则允许注入任意代码。

      优点是,你可以简单地写一个python包到install this .pth file with setuptools,安装到你想改变的virtualenv。

      【讨论】:

      • 这种方式在 ubuntu 中也行不通。此外,python 2.x 已过时。您可以通过site.USER_SITE 导入site module 来获取此路径。
      【解决方案4】:

      从我的尝试看来,如果您在虚拟环境中创建一个sitecustomize.py 文件,它将优先于安装在/usr/lib/python2.7 目录中的全局sitecustomize.py。这是我所做的:

      在虚拟环境中创建sitecustomize.py

      $ echo "import os; os.environ['FOO'] = 'BAR'" > ~/venvs/env_test/lib/python2.7/sitecustomize.py
      

      在虚拟环境中运行 Python 二进制文件时验证它是否被导入并执行

      $ ~/venvs/env_test/bin/python
      Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
      [GCC 7.3.0] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import sitecustomize
      >>> sitecustomize.__file__
      '/home/abhinav/venvs/env_test/lib/python2.7/sitecustomize.py'
      >>> import os
      >>> os.environ['FOO']
      'BAR'
      >>>
      

      只是为了验证 FOO 是否已设置,即使没有显式导入 sitecustomize

      $ ~/venvs/env_test/bin/python
      Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
      [GCC 7.3.0] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import os
      >>> os.environ['FOO']
      'BAR'
      >>>
      

      【讨论】:

      • 这在 Ubuntu 20.04.2 LTS 和 python 3.8.5 中对我不起作用,因为 ENABLE_USER_SITE 设置为 False
      【解决方案5】:

      有点老套,但应该可以。

      1. 将虚拟环境中的python 链接bin 重命名为python.lnk
      2. bin 文件夹中创建文件python,看起来像

        #!/bin/sh
        
        export TEST='它有效!'
        
        "$0.lnk" "$@"
      3. 使其可执行

        chmod +x python

      如果你运行类似的脚本

      #!/work/venv/bin/python
      导入操作系统
      
      print 'Virtualenv 变量 TEST="{}"'.format(os.environ['TEST'])

      如下:

      ./myscript.py

      打印出来:

      Virtualenv variable TEST="It works!"

      【讨论】:

      • 这是正确答案。只有这样才能调整 他的 python sheebang 这是他问题中的真正问题。
      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2015-05-30
      • 2019-07-02
      • 2014-09-29
      • 2016-06-27
      相关资源
      最近更新 更多