从脚本中获取virtualenv的bin文件夹路径

时间:2014-02-25 03:06:02

标签: python django virtualenv virtualenvwrapper

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

./manage.py generate_configuration > much_nice.conf

然后将文件移到别处。其中一个生成的配置文件是启动芹菜工作者的supervisord的任务。我遇到的问题是我不知道如何输出virtualenv的bin文件夹的芹菜可执行文件的路径。基本上,我想要输出命令

which celery

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

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

4 个答案:

答案 0 :(得分:60)

虚拟环境的路径位于环境变量VIRTUAL_ENV

echo $VIRTUAL_ENV

答案 1 :(得分:3)

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可执行文件的路径, 然后建立芹菜的路径:

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)

答案 2 :(得分:1)

引用 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

答案 3 :(得分:0)

您可以使用fabric从python

执行此类操作
>>> from fabric.api import local
>>> local('which celery')