Python virtualenv를 종료 / 종료 / 비활성화하는 방법


1605

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

답변:


2593

일반적으로 virtualenv를 활성화하면 다음과 같은 이름의 쉘 함수가 제공됩니다.

$ deactivate

상황을 정상으로 되돌립니다.

방금 코드를 다시 살펴 보았습니다 virtualenvwrapper. 그렇습니다 deactivate. 모든 virtualenv에서 벗어날 수있는 방법으로 도 지원합니다 .

Anaconda 환경 을 떠나려고하는 경우 명령은 버전에 따라 다릅니다 conda. 4.6과 같은 최신 버전 conda은 쉘에 직접 함수를 설치합니다 .이 경우 다음을 실행합니다.

conda deactivate

이전 버전의 conda 버전은 독립형 스크립트를 사용하여 비활성화를 구현합니다.

source deactivate

126
“deactivate”명령은 바이너리가 아니며“source”인 스크립트가 아닙니다. "activate"스크립트에 의해 현재 쉘에서 동적으로 정의되는 쉘 별명입니다.
Brandon Rhodes

6
@Apreche 그 동안 (약 4 년 후) 이것은 문서 에 추가 된 것으로 보입니다 .
gertvdijk

6
"workoff"또는 "unworkon"이라고하면 훨씬 더 직관적입니다. 또는 "workon"이 "activate"라고하는 경우 별명을 주셔서 감사합니다.
kkurian

4
@kkurian — 이슈 트래커에서 virtualenvwrapperDoug Hellmann 이이를 고려할 것을 제안해야 합니다! 참고 나중에 이러한 의견을 읽을 수있는 사람들을 위해, 그것은 workon이다 NOT 네이티브 virtualenv하지만 (원래의 질문에 대해 무엇 인) 명령을 virtualenvwrapper명령!
Brandon Rhodes

17
"workon"내부의 실제 virtualenv 명령이 무엇이라고 생각하십니까? ... (스포일러 경고) ... ... (스포일러 경고) ... ... (스포일러 경고) ... ... (스포일러 경고) ... 활성화!
FutureNerd

53

나는 정의 별칭 , workoff을 반대로, workon :

alias workoff='deactivate'

기억하기 쉽습니다.

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

1
어느 파일에서? .bashrc?
juned

@seyed yes.~/.bashrc
Bob Stein

21
나는이 별명을 좋아한다. 가라테 키드 생각 나는 (waxon, waxoff)
C0deH4cker

@ C0deH4cker : 나는 SO에 로그인하고 당신의 의견을 +1하기 위해이 질문으로 돌아 왔습니다 : p
pooley1994

lol 나는 생각하고 있었다 (박수; 박수). 우리도 (저크
Edison

53

사용하다:

$ deactivate 

그래도 문제가 해결되지 않으면

$ source deactivate

Bash의source 작동 방식을 아는 사람 은 이상하다고 생각하지만 virtualenv 주변의 일부 래퍼 / 워크 플로우는이를 보완 / 대응으로 구현합니다 source activate. 귀하의 마일리지가 다를 수 있습니다.


7
deactivateactivate파일 을 소싱 할 때 생성되는 함수입니다 . source deactivatedeactivate
Anthon

7
이것은 다운 보트를받을 자격이 없습니다. 선택한 응답 편집 참조 : 소스 비활성화는 아나콘다 환경 용입니다.
Doug Bradshaw

2
SO 답변 품질 표준을 충족시키지 못해서 공감할 자격이 있습니다. 대답보다 더 많은 의견입니다. 그러나 포스터의 79 명성으로 인해 우리는 친절하고 좋은 피드백을 제공해야합니다.
Bruno Bronosky


쉘에 비활성화 명령이 없으면 매우 도움이되지 않습니다. 왜 이것이 문제에 도움이되는지 이해하지 못합니다. 가상 환경에는 비활성화 스크립트가 없습니다.
bgenchel

19

Python 가상 환경을 활성화하려면 다음을 수행하십시오.

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

비활성화하려면 :

$deactivate

3
OS X10.11.1 IN 단자에, 나는 사용 것 같다 :$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

3
"source"는 "."와 같습니다. 명령은 .. 하나의 파일 소스로 사용할 수 있습니다
코리 골드버그

11

Miniconda3 환경에서 다음을 실행해야한다는 것을 알았습니다.

conda deactivate

나도 일 하지 deactivate않았다 source deactivate.


1
deactivate위해이었다 virtualenv, 그리고 source deactivate리눅스에 오래된 CONDA입니다. conda deactivateconda envs (virtuenvs 아님)를위한 좋은 크로스 플랫폼 방법입니다
Tomasz Gandor

6

virtualenvwrapper작업 방식을 쉽게하기 위해 사용할 수 있습니다 virtualenv.

설치 virtualenvwrapper:

pip install virtualenvwrapper

표준 쉘을 사용하는 경우 ~/.bashrc또는 Oh My Zsh~/.zshrc 를 사용하는 경우를여 십시오 . 다음 두 줄을 추가하십시오.

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

1
다른 게시물의 주석에서 언급했듯이 (그리고 Stackoverflow는 그것을 지적하는 실질적인 방법이 없습니다) 먼저이 deactivate기능을 정의하는 스크립트를 소싱하지 않으면 쉘 스크립트에서 사용할 수 없습니다 (이 경우 해당 명령을 찾을 수 없습니다.) . 오류)
마리아노 루이즈

4

이후 deactivate소싱에 의해 생성 기능이 ~/bin/activate이러한 명령을 찾는 일반적인 방법으로 발견 할 수없는 ~/bin, 당신은 단지 기능을 실행을 만들 수도 있습니다deactivate .

문제는 deactivate단일 명령 deactivate을 포함하는 이름의 스크립트 가 venv에 있지 않은 동안 실수로 실행될 경우 무한 루프를 발생 시킨다는 것입니다. 흔한 실수입니다.

이것은 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

내가 사용 zsh을-autoenv 기반으로한다 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" 단지 이름 일뿐입니다 ... 여기서 Illuminati에 연결되는 숨겨진 의미는 없습니다.


1

deactivatevenv의 activate스크립트 에서 제공 하는 기능을 사용 하려면 원래 활성화 뿐만 아니라 스위치 , 구성 또는 기타 를 고려하여 모든 환경 변수를 이전 상태로 다시 재설정하기 위해 비활성화 기능을 올바르게 코딩 해야 합니다 . 작업 은 그 동안 할 수 있습니다.

아마 괜찮을지 모르지만 나중에 환경을 수정 한 채로 0이 아닌 새로운 위험을 초래합니다.

프로세스가 직접 부모의 환경 변수를 변경하는 그러나, 기술적으로 가능하지 우리가 절대적으로 확인하기 위해 별도의 서브 쉘을 사용할 수 있도록 우리 venv의 뒤에 잔여 변화를 두지 마십시오 :


활성화하려면 :

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

  • 이것은 주위에 새로운 쉘을 시작합니다 venv. 원래 bash쉘은 수정되지 않은 상태로 유지됩니다.

비활성화하려면 :

$ exitOR [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
비활성화하면 환경 경로, 시스템 경로, 기본 프롬프트의 값이 재설정되면 비활성화 기능이 적합합니다. 나는 당신의 대본을 좋아합니다. +1이 이미 주어졌습니다.
Ramkumar D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.