Pythonスクリプトでvirtualenvをアクティブ化する


91

Pythonスクリプトからvirtualenvインスタンスをアクティブ化したい。

非常に簡単に実行できることはわかっていますが、これまでに見たすべての例では、これを使用してenv内でコマンドを実行し、サブプロセスを閉じています。

bin / activateと同じように、virtualenvをアクティブにしてシェルに戻りたいだけです。

このようなもの:

$me: my-script.py -d env-name
$(env-name)me:

これは可能ですか?

関連:

virtualenv›スクリプトからenvを呼び出す

回答:


88

virtualenvでPythonサブプロセスを実行する場合は、virtualenvの/ bin /ディレクトリ内にあるPythonインタープリターを使用してスクリプトを実行することで実行できます。

import subprocess

# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

ただし、サブプロセスではなく現在のPythonインタープリターでvirtualenvをアクティブ化する場合は、次のactivate_this.pyスクリプトを使用できます。

# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))

1
//、この回答の最初のコードブロックの最後の行は次のように読むべきではありません:subprocess.Popen([venv_python_file, script_file])
Nathan Basanese 2015

//、また、script_file任意の場所からを実行する方法はありvirtualenvますか、それともディレクトリ内にある必要がありますか?
Nathan Basanese 2015

エラーに気付いてくれてありがとう。2番目の質問については、script_filevirtualenvディレクトリにある必要はありません。どこにでも置くことができます。
嘘ライアン

2番目のオプションを使用している場合、どうすれば仮想環境を非アクティブ化できますか?
falsePockets 2017

@falsePockets:XY問題、なぜあなたはそれをしたいのですか?
嘘ライアン

42

virtualenvのインタープリターの下でスクリプトを実行する最も簡単な解決策は、スクリプトの最初のように、デフォルトのシバン行をvirtualenvのインタープリターへのパスに置き換えることです。

#!/path/to/project/venv/bin/python

スクリプトを実行可能にします。

chmod u+x script.py

スクリプトを実行します。

./script.py

出来上がり!


2
エレガンスのために+1。Windowsでの注意:これには、cygwinやmsysなどのシバンラインを理解するposix準拠の環境が必要です
qneill

1
Python3.6.3とWindows10で動作します!
toonarmycaptain 2017年

元の質問を誤解したかもしれないと思います。彼は、スクリプトを使用して仮想環境をアクティブ化し、アクティブ化された環境を使用してシェルに戻りたいと考えています。私の答えは仮想環境でスクリプトを実行しますが、返されたシェルは環境を保持しません。現代のソリューションはvirtualenvwrapperです:virtualenvwrapper.readthedocs.io/en/latest/#。これにより、異なるvirtualenvをアクティブにして切り替えることができます。
nafooesi 2017

20

はい、問題は単純ではありませんが、解決策は単純です。

まず、「source」コマンドをラップするシェルスクリプトを作成する必要がありました。それは私が「。」を使用したと言った。代わりに、Bashスクリプトのソースよりも使用する方が良いと読んだためです。

#!/bin/bash
. /path/to/env/bin/activate

次に、Pythonスクリプトから、これを簡単に実行できます。

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

全体のトリックは--rcfile議論の中にあります。

Pythonインタープリターが終了すると、アクティブ化された環境に現在のシェルが残ります。

勝つ!


3
本当にわかりません。どうしてそんなことをしないのですか:os.system('/bin/bash --rcfile path/to/env/activate') bashのインスタンスが開始されると、-rcfileの引数として.bashrcが使用されます。したがって、rcfileがアクティブ化ファイルであることを指定するだけです...いいえ?
depado 2013

@Depado私はあなたの解決策を試しましたが、これによりPython内のシェルがアクティブになります。少なくともシェルで試してみると。>>> os.system( '/ bin / bash --rcfile / var / envs / test / bin / activate')(test)tcraig @ tallis-desktop:〜$(test)tcraig @ tallis-desktop:〜$ ls -l合計706288–
トレントン

たぶん、しかしこれはスクリプトで機能します。この手法の唯一の不便な点は、すべてのエイリアスと〜/ .bashrcにあるすべてのものを取得できないことです。しかし、私はそれで大丈夫です。たとえば、「ls」コマンドには色がありません。しかし、すべてが私のために働きます。出発したいときは、Ctrl + D
Depado 2013

7
「Pythonインタープリターが終了すると、現在のシェルがアクティブ化された環境に残ります」何ですか?サブプロセスとしてまったく新しいシェルを生成し、終了するまで待機します。
コス2013年

私のリポジトリ上でより多くの新しいファイルを作成しないようにしても、現在のbashの設定を複製するためには、私はこれをしなかった:cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
WhyWhat

17

Virtualenvの公式ドキュメントに従って別のPython環境を実行するには、コマンドラインで実行可能なPythonバイナリへのフルパスを指定できます(以前にvirtualenvをアクティブにする必要はありません)。

/path/to/virtualenv/bin/python

virtualenvを使用してコマンドラインからスクリプトを呼び出す場合も同様です。前にアクティブ化する必要はありません。

me$ /path/to/virtualenv/bin/python myscript.py

Windows環境でも同じです(コマンドラインからでもスクリプトからでも)。

> \path\to\env\Scripts\python.exe myscript.py

2
質問:Pythonスクリプトを使用してvirtualenvをアクティブ化する(シェルからではない)
Zaheer

3
はい、私のポイントは、コンソールまたはスクリプトから前にアクティブ化する必要なしに、仮想環境からPythonランタイムを呼び出すことができるということです。答えを明確にします、ありがとう!
Mariano Ruiz

おやまあー!私はそれについて考えていませんでした。これは私のために働いた唯一の解決策です:)。現在、phpからpythonスクリプトを実行しているときは、「path / to / virtualenv / bin / pythonmypythonscript.py」を使用しています
Zaheer

6

私のために働くただ簡単な解決策。基本的に役に立たないステップを実行するBashスクリプトが必要な理由がわかりません(私は間違っていますか?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

これは基本的にあなたが必要とすることをします:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

次に、仮想環境を非アクティブ化する代わりに、Ctrl+Dまたは終了します。それは可能な解決策ですか、それともあなたが望んでいたものではありませんか?


2

子プロセス環境は、存在しなくなった瞬間に失われ、環境コンテンツをそこから親に移動するのはやや注意が必要です。

おそらく、virtualenv環境変数をファイルに出力するシェルスクリプト(動的に/ tmpに生成できます)を生成する必要があります。このスクリプトは、親Pythonプロセスで読み取られ、os.environに配置されます。

または、open( "bin / activate")の行に使用するアクティベートスクリプトを解析し、手動で抽出して、os.environに配置します。トリッキーですが、不可能ではありません。


2
あなたはこのようなことを意味しますか?bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/...
H3。

2

一番上の答えはPython2.xでのみ機能します

Python 3.xの場合、これを使用します。

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

参照:Python 3のexecfileに代わるものは何ですか?


1
activate_this.pyとは
randyPen19年

1
@randyPenの場合、プロジェクトディレクトリにvirtualenvをビルドすると、activate_this.pyファイルが自動的に追加されます。(つまり、/ project / directory / venv / bin / activate_this.py)
理論的には

-2

のように、すべてvirtualenvを1つのフォルダに作成する必要がありますvirt

virtualenvフォルダー名がvirtであると仮定し、変更しない場合

cd
mkdir custom

以下の行をコピーしてください...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

シェルスクリプトファイルを作成し、上記の行を貼り付けます...

touch custom/vhelper
nano custom/vhelper

ファイルに実行可能権限を付与します。

sudo chmod +x custom/vhelper

次に、そのカスタムフォルダパスをエクスポートして、タブをクリックしてコマンドラインで見つけられるようにします...

export PATH = $ PATH: "$ HOME / custom"

以下のコマンドを入力するだけで、どこからでも使用できます...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

それがabcだとしましょう...

vhelper abc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.