Cách rời khỏi / thoát / hủy kích hoạt một virtualenv Python


1607

Tôi đang sử dụng virtualenv và virtualenvwrapper. Tôi có thể chuyển đổi giữa virtualenv chỉ bằng cách sử dụng workonlệnh.

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

Làm cách nào để thoát tất cả các máy ảo và hoạt động lại trên máy thật của tôi? Ngay bây giờ, cách duy nhất tôi có để quay trở lại me@mymachine:~$là thoát khỏi vỏ và bắt đầu một cái mới. Điều đó thật khó chịu. Có một lệnh để làm việc trên "không có gì", và nếu vậy, nó là gì? Nếu một lệnh như vậy không tồn tại, làm thế nào tôi có thể tạo ra nó?


5
Có một lệnh để làm việc "không có gì" - nó hiển thị tất cả các môi trường ảo có sẵn của bạn, khá tiện lợi. Chỉ cần gõ "workon" không có đối số và nhấn enter. Lệnh rời đi là "hủy kích hoạt", như được trả lời dưới đây.
Dannid

Câu trả lời:


2595

Thông thường, kích hoạt virtualenv cung cấp cho bạn một hàm shell có tên:

$ deactivate

mà đưa mọi thứ trở lại bình thường.

Tôi vừa mới xem lại mã một cách cụ thể virtualenvwrapper, và, vâng, nó cũng hỗ trợ deactivatenhư là cách để thoát khỏi tất cả các virtualenvs.

Nếu bạn đang cố gắng rời khỏi môi trường Anaconda , lệnh sẽ phụ thuộc vào phiên bản của bạn conda. Các phiên bản gần đây (như 4.6) cài đặt một condachức năng trực tiếp trong trình bao của bạn, trong trường hợp bạn chạy:

conda deactivate

Thay vào đó, các phiên bản conda cũ hơn thực hiện hủy kích hoạt bằng cách sử dụng tập lệnh độc lập:

source deactivate

126
Lệnh hủy kích hoạt trên mạng không phải là một tệp nhị phân, cũng không phải là tập lệnh mà bạn có thể sử dụng mã nguồn; đó là một bí danh hệ vỏ được xác định động trong trình bao hiện tại của bạn bằng tập lệnh kích hoạt trên mạng.
Brandon Rhodes

6
@Apreche Trong khi đó (gần bốn năm sau), điều này dường như đã được thêm vào tài liệu.
gertvdijk

6
Sẽ trực quan hơn nhiều nếu nó được gọi là "workoff" hoặc "unworkon". Hoặc nếu "workon" được gọi là "kích hoạt". Cảm ơn lòng tốt cho bí danh.
kkurian

4
@kkurian - bạn nên đề xuất rằng theo dõi vấn đề virtualenvwrappervà có lẽ Doug Hellmann sẽ xem xét nó! Lưu ý, đối với những người có thể đọc những bình luận sau, mà workonKHÔNG một người gốc virtualenvlệnh (đó là những gì các câu hỏi ban đầu là về) nhưng một virtualenvwrapperlệnh!
Brandon Rhodes

17
Đoán xem lệnh virtualenv thực tế bên trong "workon" được gọi là gì? ... (Cảnh báo spoiler) ... ... (cảnh báo spoiler) ... ... (cảnh báo spoiler) ... ... (cảnh báo spoiler) ... kích hoạt!
FutureNerd

53

Tôi xác định một bí danh , workoff , như trái ngược với workon :

alias workoff='deactivate'

Rất dễ nhớ:

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

1
Trong tập tin nào? .bashrc?
Seyed

@seyed có, xem câu trả lời này để biết ví dụ về bí danh trong~/.bashrc
Bob Stein

21
Tôi thích bí danh này. Nhắc tôi nhớ về Karate Kid (waxon; waxoff)
C0deH4cker

@ C0deH4cker: Tôi đã đăng nhập vào SO và quay lại câu hỏi này chỉ để +1 nhận xét của bạn: p
pooley1994

lol tôi đã suy nghĩ (vỗ tay; vỗ tay). Tôi đoán chúng ta cũng có thể bao gồm (jerk--)
Edison

53

Sử dụng:

$ deactivate 

Nếu điều này không hiệu quả, hãy thử

$ source deactivate

Bất cứ ai biết cách Bashsource làm việc sẽ nghĩ điều đó thật kỳ quặc, nhưng một số trình bao bọc / quy trình công việc xung quanh virtualenv thực hiện nó như một sự bổ sung / đối tác source activate. Số dặm của bạn có thể thay đổi.


7
deactivatelà một chức năng được tạo khi bạn nguồn activatetập tin. Đề xuất của bạn source deactivatekhông có ý nghĩa gì cả, vì không có tệp nào được đặt têndeactivate
Anthon

7
Điều này không xứng đáng với các downvote. Xem chỉnh sửa phản hồi đã chọn: hủy kích hoạt nguồn dành cho môi trường anaconda.
Doug Bradshaw

2
Nó "xứng đáng" downvote vì không đáp ứng các tiêu chuẩn chất lượng câu trả lời SO . Đó là một nhận xét nhiều hơn là một câu trả lời. Nhưng, vì danh tiếng 79 của người đăng, chúng tôi nên tốt đẹp và đưa ra phản hồi tốt.
Bruno Bronosky 17/03/2017

@Abdul Tôi đã trình bày cách bạn có thể cải thiện chất lượng câu trả lời của mình trong Phiên bản 2 tại stackoverflow.com/posts/29586756/revutions
Bruno Bronosky 17/03/2017

Điều này rất không có ích nếu bạn không có lệnh hủy kích hoạt trong trình bao của mình. Tôi thực sự không hiểu tại sao điều này sẽ giúp vấn đề. Không có kịch bản hủy kích hoạt trong env ảo.
bgenchel

19

Để kích hoạt môi trường ảo Python:

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

Để hủy kích hoạt:

$deactivate

3
Trong thiết bị đầu cuối trên OS X10.11.1, tôi dường như phải sử dụng:$source activate
Eric Milliot-Martinez

Tôi không cần nguồn. Tôi đã làm $cd /to/dir/i/want/my/virtualenv/installedsau $virtualenv name_i_want_for_itđó $. name_i_want_for_it/bin/activatevirtualenv vẫn có vẻ hơi xa vời với tôi. Cần phải được cải thiện ...
uchuugaka

3
"nguồn" giống như "." lệnh .. hoặc có thể được sử dụng để nguồn một tệp
Corey Goldberg

11

Tôi thấy rằng khi ở trong môi trường Miniconda3 tôi phải chạy:

conda deactivate

Không deactivatephải cũng không source deactivatelàm việc cho tôi.


1
deactivatelà cho virtualenv, và source deactivatelà cho conda cũ trên Linux. conda deactivatelà một cách đa nền tảng tốt cho conda envs (không phải virtualenvs)
Tomasz Gandor

6

Bạn có thể sử dụng virtualenvwrapperđể giảm bớt cách bạn làm việc virtualenv.

Cài đặt virtualenvwrapper:

pip install virtualenvwrapper

Nếu bạn đang sử dụng shell tiêu chuẩn, hãy mở ~/.bashrchoặc ~/.zshrcnếu bạn sử dụng Oh My Zsh . Thêm hai dòng sau:

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

Để kích hoạt một virtualenv hiện có, sử dụng lệnh workon:

$ workon myenv
(myenv)$

Để hủy kích hoạt virtualenv của bạn:

(myenv)$ deactivate

Dưới đây là hướng dẫn của tôi , từng bước về cách cài đặt virtualenv và virtualenvwrapper.


2
Tôi thấy một chút khác biệt so với virtualenv tích hợp
Nam G VU

1
@NamGVU Lưu ý workonlệnh, nó hoạt động từ bất kỳ thư mục nào.
igaurav

1
Như đã đề cập trong bình luận của bài đăng khác (và Stackoverflow không có cách thực tế để chỉ đến nó), bạn không thể sử dụng deactivatetập lệnh shell mà không tìm nguồn cung cấp tập lệnh xác định chức năng này (trong trường hợp đó bạn sẽ không tìm thấy lệnh đó .. . lỗi)
Mariano Ruiz

4

deactivatehàm được tạo bởi nguồn ~/bin/activatekhông thể được phát hiện bằng các phương tiện thông thường để tìm kiếm một lệnh như vậy ~/bin, nên bạn có thể muốn tạo một hàm chỉ thực thi hàm deactivate.

Vấn đề là một tập lệnh có tên deactivatechứa một lệnh deactivatesẽ gây ra một vòng lặp vô tận nếu vô tình thực thi trong khi không ở venv. Một lỗi phổ biến.

Điều này có thể tránh được bằng cách chỉ thực thi deactivatenếu hàm tồn tại (nghĩa là đã được tạo bởi nguồn activate).

#!/bin/bash

declare -Ff deactivate  && deactivate

3

Sử dụng deactivate.

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

Lưu ý, (my_env)đã biến mất.


2

Tôi sử dụng zsh-autoenv dựa trên autoenv .

zsh-autoenv tự động nguồn .autoenv.zshcác tệp (đã biết / danh sách trắng) , thường được sử dụng trong các thư mục gốc của dự án. Nó xử lý các sự kiện "nhập" và để lại ", lồng và sắp xếp các biến (ghi đè và khôi phục).

Đây là một ví dụ:

; 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

Vì vậy, khi tôi rời khỏi dtreethư mục, môi trường ảo sẽ tự động thoát.

"Development tree utiles" chỉ là một cái tên Không có ý nghĩa ẩn liên kết đến Illuminati ở đây.


1

Sử dụng deactivatetính năng được cung cấp bởi activatetập lệnh của venv yêu cầu bạn tin tưởng chức năng hủy kích hoạt được mã hóa chính xác để thiết lập lại sạch tất cả các biến môi trường trở lại như trước khi chúng không tính đến việc kích hoạt ban đầu , mà còn cho bất kỳ công tắc , cấu hình hay cấu hình nào khác công việc bạn có thể đã làm trong thời gian đó.

Nó có thể tốt, nhưng nó mang lại một rủi ro mới, khác không khi khiến môi trường của bạn bị sửa đổi sau đó.

Tuy nhiên, về mặt kỹ thuật, quy trình không thể thay đổi trực tiếp các biến môi trường của cha mẹ, vì vậy chúng tôi có thể sử dụng một vỏ con riêng biệt để chắc chắn rằng chúng tôi venvkhông để lại bất kỳ thay đổi còn lại nào:


Để kích hoạt:

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

  • Điều này bắt đầu một vỏ mới xung quanh venv. bashVỏ ban đầu của bạn vẫn không thay đổi.

Để hủy kích hoạt:

$ exitHOẶC [CTRL]+[D]

  • Thao tác này sẽ thoát toàn bộ trình bao venvtrong và đưa bạn trở lại trình bao ban đầu từ trước khi tập lệnh kích hoạt thực hiện bất kỳ thay đổi nào đối với môi trường.

Thí dụ:

[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

Tôi gặp vấn đề tương tự khi làm việc với tập lệnh cài đặt. Tôi đã xem những gì bin / activ_this.py đã làm và đảo ngược nó.

Thí dụ:

#! /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())

Tôi không chắc chắn 100% nếu nó hoạt động như dự định. Tôi có thể đã bỏ lỡ một cái gì đó hoàn toàn.


2
nếu hủy kích hoạt đặt lại giá trị của đường dẫn môi trường, đường dẫn hệ thống, dấu nhắc mặc định thì chức năng hủy kích hoạt của bạn là cách tiếp cận tốt. Tôi thích kịch bản của bạn. Đã cho +1.
Ramkumar D
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.