Cara meninggalkan / keluar / menonaktifkan virtualenv Python

1607

Saya menggunakan virtualenv dan virtualenvwrapper. Saya dapat beralih di antara virtualenv saja menggunakan workonperintah.

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

Bagaimana cara keluar dari semua mesin virtual dan bekerja di mesin saya yang sebenarnya lagi? Saat ini, satu-satunya cara saya untuk kembali me@mymachine:~$adalah keluar dari shell dan memulai yang baru. Agak menyebalkan. Apakah ada perintah untuk mengerjakan "tidak ada", dan jika demikian, apa itu? Jika perintah semacam itu tidak ada, bagaimana cara saya membuatnya?

Apreche
sumber
5
Ada perintah untuk bekerja pada "tidak ada" - ini menampilkan semua lingkungan virtual yang tersedia, yang cukup bagus. Cukup ketik "workon" tanpa argumen dan tekan enter. Perintah untuk pergi adalah "nonaktifkan", seperti yang dijawab di bawah ini.
Dannid

Jawaban:

2595

Biasanya, mengaktifkan virtualenv memberi Anda fungsi shell bernama:

$ deactivate

yang membuat semuanya kembali normal.

Saya baru saja melihat secara khusus pada kode untuk virtualenvwrapper, dan, ya, itu juga mendukung deactivatesebagai cara untuk melarikan diri dari semua virtualenvs.

Jika Anda mencoba untuk meninggalkan lingkungan Anaconda , perintah tergantung pada versi Anda conda. Versi terbaru (seperti 4.6) menginstal condafungsi langsung di shell Anda, dalam hal ini Anda menjalankan:

conda deactivate

Versi conda yang lebih lama malah menerapkan penonaktifan menggunakan skrip yang berdiri sendiri:

source deactivate
Brandon Rhodes
sumber
126
Perintah "nonaktifkan" bukan biner, atau skrip yang Anda "sumber"; itu adalah alias shell yang didefinisikan secara dinamis di shell Anda saat ini oleh skrip "aktifkan".
Brandon Rhodes
6
@Apreche Sementara itu (hampir empat tahun kemudian) ini tampaknya telah ditambahkan ke dokumentasi.
gertvdijk
6
Akan jauh lebih intuitif jika disebut "workoff" atau "unworkon". Atau jika "workon" dipanggil "aktifkan". Syukurlah untuk alias.
kkurian
4
@kkurian - Anda harus menyarankan bahwa pada pelacak masalah untuk virtualenvwrapperdan mungkin Doug Hellmann akan mempertimbangkannya! Catatan, bagi mereka yang mungkin membaca komentar ini nanti, yang workonadalah TIDAK asli virtualenvperintah (yang adalah apa pertanyaan awal adalah tentang) tetapi virtualenvwrapperperintah!
Brandon Rhodes
17
Coba tebak apa yang disebut perintah virtualenv sebenarnya di dalam "workon"? ... (peringatan spoiler) ... ... (peringatan spoiler) ... ... (peringatan spoiler) ... ... (peringatan spoiler) ... aktifkan!
FutureNerd
53

Saya mendefinisikan alias , workoff , sebagai kebalikan dari workon :

alias workoff='deactivate'

Mudah diingat:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
Bob Stein
sumber
1
Di file mana? .bashrc?
Seyed
@ teringat ya, lihat jawaban ini untuk contoh alias dalam~/.bashrc
Bob Stein
21
Saya suka alias ini. Mengingatkan saya pada Karate Kid (waxon; waxoff)
C0deH4cker
@ C0deH4cker: Saya masuk ke SO dan kembali ke pertanyaan ini hanya untuk memberi +1 pada komentar Anda: p
pooley1994
lol saya sedang berpikir (bertepuk tangan; bertepuk tangan). Saya kira kita juga bisa memasukkan (brengsek)
Edison
53

Menggunakan:

$ deactivate 

Jika ini tidak berhasil, coba

$ source deactivate

Siapa pun yang tahu bagaimana Bashsource bekerja akan berpikir itu aneh, tetapi beberapa pembungkus / alur kerja di sekitar virtualenv menerapkannya sebagai pelengkap / mitra untuk source activate. Jarak tempuh Anda mungkin beragam.

DarkRider
sumber
7
deactivateadalah fungsi yang akan dibuat saat Anda sumber activatefile. Saran Anda untuk melakukan source deactivatetidak masuk akal sama sekali, karena tidak ada file bernamadeactivate
Anthon
7
Ini tidak pantas diturunkan. Lihat edit respons yang dipilih: sumber deaktivasi adalah untuk lingkungan anaconda.
Doug Bradshaw
2
Itu "layak" downvotes untuk tidak memenuhi standar kualitas jawaban SO . Ini lebih dari sekedar komentar daripada jawaban. Tetapi, karena reputasi poster itu, kita harus baik dan memberikan umpan balik yang baik.
Bruno Bronosky
@Abdul Saya telah menunjukkan bagaimana Anda dapat meningkatkan kualitas jawaban Anda di Revisi 2 di stackoverflow.com/posts/29586756/revisions
Bruno Bronosky
ini sangat tidak membantu jika Anda tidak memiliki perintah nonaktifkan di shell Anda. Saya tidak begitu mengerti mengapa ini bisa membantu masalah. Tidak ada menonaktifkan skrip di env virtual.
bgenchel
19

Untuk mengaktifkan lingkungan virtual Python:

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

Untuk menonaktifkan:

$deactivate
Amitesh Ranjan
sumber
3
Dalam terminal pada OS X10.11.1, saya tampaknya harus menggunakan:$source activate
Eric Milliot-Martinez
Saya tidak membutuhkan sumber. Saya melakukan $cd /to/dir/i/want/my/virtualenv/installeditu $virtualenv name_i_want_for_itkemudian $. name_i_want_for_it/bin/activatevirtualenv masih tampak sedikit off untuk saya. Perlu ditingkatkan ...
uchuugaka
3
"sumber" sama dengan "." command .. bisa digunakan untuk sumber file
Corey Goldberg
11

Saya menemukan bahwa ketika dalam lingkungan Miniconda3 saya harus menjalankan:

conda deactivate

Baik deactivateatau source deactivatebekerja untuk saya.

CephBirk
sumber
1
deactivateadalah untuk virtualenv, dan source deactivateuntuk conda lama di Linux. conda deactivateadalah cara lintas platform yang baik untuk conda envs (bukan virtualenvs)
Tomasz Gandor
6

Anda dapat menggunakannya virtualenvwrapperuntuk memudahkan cara Anda bekerja virtualenv.

Menginstal virtualenvwrapper:

pip install virtualenvwrapper

Jika Anda menggunakan shell standar, buka ~/.bashrcatau ~/.zshrcjika Anda menggunakan Oh My Zsh . Tambahkan dua baris ini:

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

Untuk mengaktifkan virtualenv yang ada, gunakan perintah workon:

$ workon myenv
(myenv)$

Untuk menonaktifkan virtualenv Anda:

(myenv)$ deactivate

Inilah tutorial saya , langkah demi langkah tentang cara menginstal virtualenv dan virtualenvwrapper.

pungutan
sumber
2
Saya melihat sedikit perbedaan dibandingkan dengan virtualenv bawaan
Nam G VU
1
@NamGVU Perhatikan workonperintahnya, ia berfungsi dari direktori mana pun.
igaurav
1
Seperti disebutkan dalam komentar postingan lain (dan Stackoverflow tidak memiliki cara praktis untuk menunjukkannya) Anda tidak dapat menggunakan deactivateskrip shell tanpa terlebih dahulu mencari skrip yang mendefinisikan fungsi ini (dalam hal ini Anda tidak akan menemukan perintah itu .. . error)
Mariano Ruiz
4

Karena deactivatefungsi yang dibuat oleh sumber ~/bin/activatetidak dapat ditemukan dengan cara biasa mencari perintah seperti itu ~/bin, Anda mungkin ingin membuat satu yang hanya menjalankan fungsi deactivate.

Masalahnya adalah bahwa skrip bernama deactivateberisi perintah tunggal deactivateakan menyebabkan loop tanpa akhir jika secara tidak sengaja dieksekusi saat tidak di dalam vv Kesalahan umum.

Ini dapat dihindari dengan hanya mengeksekusi deactivatejika fungsi ada (yaitu telah dibuat dengan sumber activate).

#!/bin/bash

declare -Ff deactivate  && deactivate
DocSalvager
sumber
3

Gunakan deactivate.

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

Catatan, (my_env)hilang.

Aturan Basant
sumber
2

Saya menggunakan zsh-autoenv yang didasarkan pada autoenv .

zsh-autoenv secara otomatis sumber .autoenv.zshfile (dikenal / masuk daftar putih) , biasanya digunakan dalam direktori root proyek. Ini menangani "masuk" dan meninggalkan "acara, bersarang, dan menyimpan variabel (menimpa dan memulihkan).

Berikut ini sebuah contoh:

; 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

Jadi ketika saya meninggalkan dtreedirektori, lingkungan virtual secara otomatis keluar.

"Development tree utiles" hanyalah sebuah nama ... Tidak ada maksud tersembunyi yang menghubungkan ke Illuminati di sini.

Sardathrion - menentang penyalahgunaan SE
sumber
1

Dengan menggunakan deactivatefitur yang disediakan oleh activateskrip venv, Anda harus memercayai fungsi penonaktifan untuk dikodekan dengan benar untuk mengatur ulang semua variabel lingkungan secara bersih kembali seperti semula — dengan mempertimbangkan tidak hanya aktivasi asli , tetapi juga sakelar , konfigurasi , atau lainnya. pekerjaan yang mungkin telah Anda lakukan untuk sementara waktu.

Ini mungkin baik-baik saja, tetapi itu memperkenalkan risiko baru, tanpa nol meninggalkan lingkungan Anda dimodifikasi setelahnya.

Namun, secara teknis tidak mungkin bagi suatu proses untuk secara langsung mengubah variabel lingkungan dari induknya, sehingga kita dapat menggunakan sub-shell terpisah untuk benar-benar yakin bahwa kami venvtidak meninggalkan perubahan residual di belakang:


Mengaktifkan:

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

  • Ini memulai shell baru di sekitar venv. Kulit asli Anda bashtetap tidak dimodifikasi.

Untuk menonaktifkan:

$ exitATAU [CTRL]+[D]

  • Ini keluar dari seluruh shell yang venvada, dan menjatuhkan Anda kembali ke shell asli dari sebelum script aktivasi membuat perubahan apa pun pada lingkungan.

Contoh:

[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!
Will Chen
sumber
-1

Saya memiliki masalah yang sama saat mengerjakan skrip pemasang. Saya melihat apa yang dilakukan bin / activ_this.py dan membaliknya.

Contoh:

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

Saya tidak yakin 100% jika berfungsi sebagaimana dimaksud. Saya mungkin telah melewatkan sesuatu sepenuhnya.

Lord Sumner
sumber
2
jika menonaktifkan nilai set ulang lintasan lingkungan, lintasan sistem, prompt default maka fungsi nonaktifkan Anda adalah pendekatan yang baik. Saya suka naskah Anda. Sudah diberi +1.
Ramkumar D