web-dev-qa-db-ja.com

スクリプトからvirtualenvのbinフォルダーパスを取得する

私はvirtualenvwrapperをDjangoプロジェクトで使用していますが、プロジェクトにはいくつかの設定ファイルを自動的に書き込む管理タスクがあり、ユーザーは

./manage.py generate_configuration > much_Nice.conf

そして、ファイルを別の場所に移動します。生成された構成ファイルの1つは、セロリワーカーを起動するSupervisordのタスクです。私が得ている問題は、セロリの実行可能ファイルのパスを出力するつまり、virtualenvのbinフォルダー内の方法がわからないことです。基本的に、コマンドの出力が欲しい

which celery

1つのオプションはsys.executable、フォルダー(virtualenvのbinフォルダーであると思われる)を取得します。それだけです...しかし、よくわかりません。

Virtualenvには、パス自体を取得するメソッドがありませんか?

29

仮想環境へのパスは環境変数VIRTUAL_ENVにあります

echo $VIRTUAL_ENV
62
Brad Culberson

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)
3
Laurent LAPORTE

fabric を使用して、Pythonからそのようなことを行うことができます

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