【问题标题】:Get virtualenv's bin folder path from script从脚本中获取 virtualenv 的 bin 文件夹路径
【发布时间】:2014-03-27 01:27:10
【问题描述】:

我正在将 virtualenvwrapper 与一个 django 项目一起使用,该项目具有一个自动写入一些配置文件的管理任务,因此用户只需

./manage.py generate_configuration > much_nice.conf

然后将文件移动到别处。生成的配置文件之一是用于启动 celery worker 的 supervisord 任务。我遇到的问题是我不知道如何输出位于 virtualenv 的 bin 文件夹中的 celery 可执行文件的路径。本质上,我想要命令的输出

which celery

一个选项是使用sys.executable,获取文件夹(这似乎是virtualenv 的bin 文件夹),就是这样……但我不确定。

virtualenv 没有任何方法来获取路径本身吗?

【问题讨论】:

    标签: python django virtualenv virtualenvwrapper


    【解决方案1】:

    虚拟环境的路径在环境变量VIRTUAL_ENV中

    echo $VIRTUAL_ENV
    

    【讨论】:

    • 就是这样,谢谢。我设法使用os.environ['VIRTUAL_ENV'] 获取python 中的值。
    • 请注意,VIRTUAL_ENV 是由 virtualenv 的 activate 脚本设置的,并且可以在不激活 virtualenv 的情况下使用 virtualenv python。见:stackoverflow.com/a/1883251/1286571
    • 另外,conda 不要使用这个变量。对于使用 CONDA 或任何其他方式来管理他们的 python 发行版的用户来说,这将是一个问题。我不认为这是一种稳健的方法。使用@laurent-laporte 提出的sys.executable 似乎更可靠。
    【解决方案2】:

    VIRTUAL_ENV 环境变量仅在激活虚拟环境时可用。

    例如:

    $ python3 -m venv myapp
    $ source myapp/bin/activate
    (myapp) $ python  -c "import os; print(os.environ['VIRTUAL_ENV'])"
    /path/to/virtualenv/myapp
    

    如果没有激活,你有一个例外:

    (myapp) $ deactivate
    $ myapp/bin/python -c "import os; print(os.environ['VIRTUAL_ENV'])"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/usr/lib64/python3.4/os.py", line 635, in __getitem__
        raise KeyError(key) from None
    KeyError: 'VIRTUAL_ENV'
    

    IMO,您应该使用 sys.executable 来获取 Python 可执行文件的路径, 然后构建 celery 的路径:

    import sys
    import os
    
    celery_name = {'linux': 'celery', 'win32': 'celery.exe'}[sys.platform]
    celery_path = os.path.join(os.path.dirname(sys.executable), celery_name)
    

    【讨论】:

      【解决方案3】:

      引用 sys.prefix 怎么样?无论virtualenv是否激活,它总是输出结果,并且比获取sys.executable的祖父位置更方便。

      $ python -c 'import sys;print(sys.prefix)'
      /usr
      $ . venv/bin/activate
      (venv) $ python -c 'import sys;print(sys.prefix)'
      path/to/venv
      

      【讨论】:

        【解决方案4】:

        您可以使用fabric 从 python 中执行此类操作

        >>> from fabric.api import local
        >>> local('which celery')
        

        【讨论】:

        • 这可能行不通。启动的子 shell 不会在 $PATH 上拥有虚拟环境,因此 which 将不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 1970-01-01
        • 2015-10-07
        相关资源
        最近更新 更多