我正在使用带有django项目的virtualenvwrapper,该项目具有自动编写一些配置文件的管理任务,因此用户只需要
./manage.py generate_configuration > much_nice.conf
然后将文件移到别处。其中一个生成的配置文件是启动芹菜工作者的supervisord的任务。我遇到的问题是我不知道如何输出virtualenv的bin文件夹中的芹菜可执行文件的路径。基本上,我想要输出命令
which celery
一个选项是使用sys.executable
,获取文件夹(似乎是virtualenv的bin
文件夹)就是这样......但我不确定。
virtualenv有没有任何方法来获取路径本身?
答案 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')