从脚本中获取 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 脚本

如何为 crontab 设置 virtualenv?

在视图中获取 virtualenv 或 python 路径

如何从 virtualenv 中的 python 脚本运行 Tensorboard?

使用特定的 virtualenv 在 Jupyter notebook 中执行 Python 脚本

virtualenv中执行python脚本报错ImportError: No module named markupsafe 或 No such file or directory: '/tm