Python virtualenvを終了/終了/非アクティブ化する方法


1607

virtualenvとvirtualenvwrapperを使用しています。workonコマンドを使用して、virtualenvを問題なく切り替えることができます。

me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$ 

すべての仮想マシンを終了して、実際のマシンで再び作業するにはどうすればよいですか?現在、私が戻る唯一の方法me@mymachine:~$は、シェルを終了して新しいシェルを開始することです。それはちょっと迷惑です。「何もしない」に取り組むコマンドはありますか、ある場合、それは何ですか?そのようなコマンドが存在しない場合、どのように作成しますか?


5
「何もしない」で作業するコマンドがあります-それはかなり気の利いた、利用可能なすべての仮想環境を表示します。引数なしで「workon」と入力してEnterキーを押すだけです。以下に答えるように、去るコマンドは「非アクティブ化」です。
Dannid 2014年

回答:


2595

通常、virtualenvをアクティブ化すると、次の名前のシェル関数が提供されます。

$ deactivate

物事を通常に戻します。

私は特にのコードをもう一度見ましたがvirtualenvwrapper、そうです、それもdeactivateすべてのvirtualenvから脱出する方法としてサポートしています。

Anaconda環境を終了する場合、コマンドはのバージョンによって異なりますconda。最近のバージョン(4.6など)condaでは、シェルに関数を直接インストールします。この場合、次のコマンドを実行します。

conda deactivate

古いcondaバージョンは、代わりにスタンドアロンスクリプトを使用して非アクティブ化を実装します。

source deactivate

126
「非アクティブ化」コマンドはバイナリではなく、「ソース」するスクリプトでもありません。これは、「アクティブ化」スクリプトによって現在のシェルで動的に定義されるシェルエイリアスです。
ブランドンロードス

6
@Aprecheしばらくの間(ほぼ4年後)、これはドキュメントに追加されたようです。
gertvdijk 2013年

6
「workoff」または「unworkon」と呼ばれると、はるかに直感的になります。または、「workon」が「activate」と呼ばれた場合。エイリアスの良さに感謝します。
kkurian 2013年

4
@kkurian —あなたは、問題追跡システムでvirtualenvwrapper、おそらくDoug Hellmannがそれを検討することを提案するべきです!注意、後でこれらのコメントを読むかもしれない人のために、それはworkonありませネイティブvirtualenv(元の質問があるものについてである)コマンドが、virtualenvwrapperコマンド!
Brandon Rhodes

17
「workon」内の実際のvirtualenvコマンドは何と呼ばれていると思いますか?...(スポイラー警告)... ...(スポイラー警告)... ...(スポイラー警告)... ...(スポイラー警告)...作動!
FutureNerd 2014年

53

私はworkonの反対としてエイリアスworkoffを定義しました:

alias workoff='deactivate'

覚えやすいです:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$

1
どのファイルですか?.bashrc
2015年

@seyedはい、エイリアスの例については、この回答を参照してください~/.bashrc
ボブスタイン

21
このエイリアスが好きです。空手キッド(ワクソン;ワックスオフ)を思い出させる
C0deH4cker

@ C0deH4cker:私はSOにサインインし、コメントを+1するためにこの質問に戻りました:p
pooley1994

笑私は考えていました(クラップオン、クラップオフ)。(ジャーク
エジソン

53

使用する:

$ deactivate 

これが機能しない場合は、

$ source deactivate

Bashのsourceしくみを知っている人ならだれでも奇妙だと思うかもしれませんが、virtualenvの一部のラッパー/ワークフローは、それをの補完/対応として実装していsource activateます。あなたのマイレージは異なる場合があります。


7
deactivateactivateファイルをソースするときに作成される関数です。source deactivateという名前のファイルがないため、あなたの提案はまったく意味がありませんdeactivate
Anthon

7
これは反対票に値しません。選択した応答の編集を参照してください:ソース非アクティブ化はanaconda環境用です。
Doug Bradshaw

2
これは、SO 回答の品質基準を満たしていないことに対する反対票に「ふさわしい」ものです。答えというよりはコメントです。しかし、ポスターの79の評判のために、私たちは素晴らしく、良いフィードバックを与えるべきです。
Bruno Bronosky 2017年


シェルに非アクティブ化コマンドがない場合、これは非常に役に立ちません。これがなぜ問題を解決するのか、私にはよくわかりません。仮想環境に非アクティブ化スクリプトはありません。
bgenchel 2018

19

Python仮想環境をアクティブ化するには:

$cd ~/python-venv/
$./bin/activate

非アクティブ化するには:

$deactivate

3
OS X10.11.1の端末では、私が使用することを持っているように見える:$source activate
エリックMilliot・マルティネス

ソースは必要ありませんでした。$cd /to/dir/i/want/my/virtualenv/installedそれから私はそうしました、$virtualenv name_i_want_for_itそして$. name_i_want_for_it/bin/activatevirtualenvはまだ私には少し離れているようです 改善する必要があります...
uchuugaka '28 / 12/28

3
「ソース」は「」と同じです。コマンド..どちらもファイルのソースとして使用できます
Corey Goldberg

11

Miniconda3環境内で実行する必要があることがわかりました。

conda deactivate

どちらdeactivatesource deactivate私のために働いていません。


1
deactivate以下のためだったvirtualenv、とsource deactivateLinux上の古いcondaためです。conda deactivateconda envs(virtualenvsではない)に適したクロスプラットフォームの方法
Tomasz

6

virtualenvwrapper作業方法を簡単にするために使用できますvirtualenv

インストールvirtualenvwrapper

pip install virtualenvwrapper

標準のシェルを使用している場合は、~/.bashrcまたはを開き、Oh My Zsh~/.zshrcを使用します。次の2行を追加します。

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

既存のvirtualenvをアクティブにするには、次のコマンドを使用しますworkon

$ workon myenv
(myenv)$

virtualenvを非アクティブ化するには:

(myenv)$ deactivate

これが私のチュートリアルです。virtualenvとvirtualenvwrapperをインストールする方法を順を追って説明します。


2
組み込みのvirtualenvとの違いはほとんどない
Nam G VU

1
@NamGVU workonコマンドに注意してください。コマンドはどのディレクトリからでも機能します。
igaurav 2016

1
別の投稿のコメントで言及されているように(そしてStackoverflowにはそれを指す実用的な方法がありません)deactivate、最初にこの関数を定義するスクリプトをソースせずにシェルスクリプトで使用することはできません(その場合、そのコマンドは見つかりません)。 。エラー)
マリアーノ・ルイス

4

deactivateソーシングによって作成された関数~/bin/activateは、そのようなコマンドをで検索する通常の方法では検出できないため、関数を~/bin実行するだけの関数を作成したい場合がありますdeactivate

問題はdeactivate、単一のコマンドdeactivateを含むという名前のスクリプトが、envの外で誤って実行された場合に無限ループを引き起こすことです。よくある間違い。

これはdeactivate、関数が存在する(つまり、によって作成されたactivate)場合にのみ実行することで回避できます。

#!/bin/bash

declare -Ff deactivate  && deactivate

3

を使用しdeactivateます。

(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$ 

注、(my_env)なくなっています。


2

私はautoenvに基づいたzsh-autoenvを使用しています

zsh-autoenv.autoenv.zshは、プロジェクトのルートディレクトリで通常使用される(既知/ホワイトリスト)ファイルを自動的にソースします。これは、「Enter」および「Leave」イベント、ネスト、および変数の隠蔽(上書きおよび復元)を処理します。

次に例を示します。

; cd dtree 
Switching to virtual environment: Development tree utiles
;dtree(feature/task24|✓); cat .autoenv.zsh       
# Autoenv.
echo -n "Switching to virtual environment: "
printf "\e[38;5;93m%s\e[0m\n" "Development tree utiles"
workon dtree
# eof
dtree(feature/task24|✓); cat .autoenv_leave.zsh 
deactivate

したがって、dtreeディレクトリを離れると、仮想環境は自動的に終了します。

"Development tree utiles" ただの名前です…ここにあるイルミナティにリンクする隠された意味はありません。


1

使用deactivatevenvさんが提供する機能はactivate、スクリプトが正しく符号化する無効化機能を信頼する必要がきれいに戻って、彼らがいないだけで、アカウントへのビフォー取っていたかに全ての環境変数をリセットするには、元の活性化だけでなく、任意のスイッチコンフィギュレーション、または他のその間にあなたがしたかもしれない仕事

おそらく問題はありませんが、その後、環境を変更したままにするというゼロ以外の新しいリスクが発生します。

ただし、プロセスが親の環境変数を直接変更することは技術的に不可能であるため、別のサブシェルを使用して、venv残りの変更が残されていないことを確実に確認できます。


有効にするために:

$ bash --init-file PythonVenv/bin/activate

  • これにより、の周りに新しいシェルが開始されvenvます。元のbashシェルは変更されません。

非アクティブ化するには:

$ exitまたは[CTRL]+[D]

  • これにより、シェル全体が終了しvenv、アクティブ化スクリプトが環境に変更を加える前の元のシェルに戻ります。

例:

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

[user@computer ~]$ bash --init-file PythonVenv/bin/activate

(PythonVenv) [user@computer ~]$ echo $VIRTUAL_ENV
/home/user/PythonVenv

(PythonVenv) [user@computer ~]$ exit
exit

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

-1

インストーラースクリプトでの作業中に同じ問題が発生しました。私はbin / activate_this.pyが何をしたか見て、それを元に戻しました。

例:

#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys

# Path to virtualenv
venv_path = os.path.join('/home', 'sixdays', '.virtualenvs', 'test32')

# Save old values
old_os_path = os.environ['PATH']
old_sys_path = list(sys.path)
old_sys_prefix = sys.prefix


def deactivate():
    # Change back by setting values to starting values
    os.environ['PATH'] = old_os_path
    sys.prefix = old_sys_prefix
    sys.path[:0] = old_sys_path


# Activate the virtualenvironment
activate_this = os.path.join(venv_path, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))


# Print list of pip packages for virtualenv for example purpose
import pip
print str(pip.get_installed_distributions())

# Unload pip module
del pip

# Deactivate/switch back to initial interpreter
deactivate()

# Print list of initial environment pip packages for example purpose
import pip
print str(pip.get_installed_distributions())

意図したとおりに機能するかどうかは100%わかりません。私は何かを完全に逃したかもしれません。


2
deactivateが環境パス、システムパス、デフォルトプロンプトの値をリセットする場合、非アクティブ化機能が適切なアプローチです。私はあなたのスクリプトが好きです。すでに+1を与えられました。
Ramkumar D 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.