从脚本中获取 virtualenv 的 bin 文件夹路径
Posted
技术标签:
【中文标题】从脚本中获取 virtualenv 的 bin 文件夹路径【英文标题】:Get virtualenv's bin folder path from script 【发布时间】: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 没有任何方法来获取路径本身吗?
【问题讨论】:
【参考方案1】:虚拟环境的路径在环境变量VIRTUAL_ENV中
echo $VIRTUAL_ENV
【讨论】:
就是这样,谢谢。我设法使用os.environ['VIRTUAL_ENV']
获取python 中的值。
请注意,VIRTUAL_ENV
是由 virtualenv 的 activate
脚本设置的,并且可以在不激活 virtualenv 的情况下使用 virtualenv python。见:***.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
将不起作用。以上是关于从脚本中获取 virtualenv 的 bin 文件夹路径的主要内容,如果未能解决你的问题,请参考以下文章
Git post-recieve hook 来运行 virtualenv、Django 和各种 python 脚本
如何从 virtualenv 中的 python 脚本运行 Tensorboard?
使用特定的 virtualenv 在 Jupyter notebook 中执行 Python 脚本
virtualenv中执行python脚本报错ImportError: No module named markupsafe 或 No such file or directory: '/tm