Python virtualenv'den ayrılma / çıkış / devre dışı bırakma


1607

Virtualenv ve virtualenvwrapper kullanıyorum. Ben workonkomutu kullanarak virtualenv iyi arasında geçiş yapabilirsiniz .

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

Tüm sanal makinelerden nasıl çıkarım ve gerçek makinemde tekrar çalışırım? Şu anda geri dönmenin tek yolu me@mymachine:~$kabuktan çıkmak ve yeni bir tane başlatmak. Bu biraz sinir bozucu. "Hiçbir şey" üzerinde çalışmak için bir komut var mı, eğer öyleyse nedir? Böyle bir komut yoksa, onu nasıl oluşturabilirim?


5
"Hiçbir şey" üzerinde çalışmak için bir komut vardır - oldukça kullanışlı olan tüm mevcut sanal ortamlarınızı görüntüler. Sadece argüman olmadan "workon" yazın ve enter tuşuna basın. Ayrılma komutu aşağıda yanıtlandığı gibi "devre dışı bırak" şeklindedir.
Dannid

Yanıtlar:


2595

Genellikle, bir virtualenv'i etkinleştirmek size bir kabuk işlevi verir:

$ deactivate

bu da işleri normale döndürür.

Ben sadece özel olarak tekrar kod baktım virtualenvwrapperve, evet, deactivatetüm sanal Benen kaçmak için bir yol olarak da destekler .

Bir Anaconda ortamından ayrılmaya çalışıyorsanız , komut sürümünüze bağlıdır conda. Son sürümler (4.6 gibi) condadoğrudan kabuğunuza bir işlev yükler , bu durumda şunları çalıştırırsınız:

conda deactivate

Eski conda sürümleri tek başına bir komut dosyası kullanarak devre dışı bırakma uygular:

source deactivate

126
“Devre dışı bırak” komutu bir ikili veya “kaynakladığınız” bir komut dosyası değildir; "enable" betiği ile geçerli kabuğunuzda dinamik olarak tanımlanan bir kabuk diğer adıdır.
Brandon Rhodes

6
@Apreche Bu arada (neredeyse dört yıl sonra) bu belgelere eklenmiş gibi görünüyor .
gertvdijk

6
Eğer "iş akışı" veya "işsiz" olarak adlandırılmış olsaydı çok daha sezgisel olurdu. Ya da "workon" "etkinleştir" olarak adlandırılmışsa. Takma ad için çok şükür.
kkurian

4
@kkurian - Sorun izleyicide virtualenvwrapperDoug Hellmann'ın düşüneceğini düşünmelisin! Not sonra bu yorumları okuyabilir olanlar için, bu workonise DEĞİL bir yerli virtualenvama (orijinal soru hakkında ne olan) komut virtualenvwrapperkomut!
Brandon Rhodes

17
Tahmin et "workon" içindeki gerçek virtualenv komutunun adı nedir? ... (spoiler uyarısı) ... ... (spoiler uyarısı) ... ... (spoiler uyarısı) ... ... (spoiler uyarısı) ... etkinleştirin!
FutureNerd

53

Ben bir takma ad , iş akışı , işin tersi olarak tanımladım :

alias workoff='deactivate'

Hatırlamak kolaydır:

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

1
Hangi dosyada? .bashrc?
seyed

@seyed evet, diğer bir örnek için bu cevaba bakınız~/.bashrc
Bob Stein

21
Bu takma adı beğendim. Bana Karate Kid'i hatırlatıyor (waxon; waxoff)
C0deH4cker

@ C0deH4cker: SO'da oturum açtım ve sadece yorumunuzu + 1'lemek için bu soruya geri döndüm: p
pooley1994

lol düşünüyordum (alkışlar; alkışlar). Sanırım biz de dahil edebiliriz (pislik--)
Edison

53

kullanın:

$ deactivate 

Bu işe yaramazsa, deneyin

$ source deactivate

Bash'insource nasıl çalıştığını bilen herkes bunun garip olduğunu düşünecek, ancak virtualenv çevresindeki bazı sarmalayıcılar / iş akışları bunu bir tamamlayıcı / muadili olarak uyguluyor source activate. Kilometreniz değişebilir.


7
deactivateactivatedosyayı kaynakladığınızda oluşturulan bir işlevdir . Yapmanız gereken öneri source deactivatehiç mantıklı değil, çünkü hiçbir dosya yokdeactivate
Anthon

7
Bu aşağı oyları hak etmiyor. Seçilen yanıtın düzenlenmesine bakın: kaynak devre dışı bırakma anaconda ortamı içindir.
Doug Bradshaw

2
SO cevap kalite standartlarını karşılamaması nedeniyle aşağı oyları "hak ediyor" . Bu bir cevaptan çok bir yorumdur. Ancak, posterin 79 ünü nedeniyle, iyi olmalıyız ve iyi geribildirim vermeliyiz.
Bruno Bronosky

@Abdul Revizyon 2'de yanıt kalitenizi stackoverflow.com/posts/29586756/revisions
Bruno Bronosky

kabuğunuzda devre dışı bırakma komutunuz yoksa bu çok yardımcı olur. Bunun neden soruna yardımcı olacağını gerçekten anlamıyorum. Sanal env'de devre dışı bırakma komut dosyası yok.
bgenchel

19

Bir Python sanal ortamını etkinleştirmek için:

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

Devre dışı bırakmak için:

$deactivate

3
OS X10.11.1'deki terminalde şunu kullanmak zorundayım:$source activate
Eric Milliot-Martinez

Kaynağa ihtiyacım yoktu. Yaptığım $cd /to/dir/i/want/my/virtualenv/installedsonra $virtualenv name_i_want_for_ito $. name_i_want_for_it/bin/activateVirtualenv hala bana kapalı biraz görünüyor. Geliştirilmesi gerekiyor ...
uchuugaka

3
"kaynak", "" ile aynıdır. komut .. ya bir dosyayı kaynaklamak için kullanılabilir
Corey Goldberg

11

Bir Miniconda3 ortamında çalışmam gerektiğini fark ettim:

conda deactivate

Ne benim için ne deactivatede source deactivateişe yaradı.


1
deactivateiçindi virtualenvve source deactivateLinux üzerinde eski Conda içindir. conda deactivateconda envs için iyi bir çapraz platform yoludur (virtualenvs değil)
Tomasz Gandor

6

virtualenvwrapperÇalışma şeklinizi kolaylaştırmak için kullanabilirsiniz virtualenv.

Yükleme virtualenvwrapper:

pip install virtualenvwrapper

Standart bir kabuk kullanıyorsanız, Oh My Zsh'i açın ~/.bashrcveya ~/.zshrckullanıyorsanız . Bu iki satırı ekleyin:

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

Mevcut bir virtualenv'i etkinleştirmek için şu komutu kullanın workon:

$ workon myenv
(myenv)$

Virtualenv'inizi devre dışı bırakmak için:

(myenv)$ deactivate

İşte sanal öğretici ve virtualenvwrapper'ın nasıl kurulacağı konusunda adım adım öğretici .


2
Yerleşik virtualenv ile karşılaştırıldığında çok az fark görüyorum
Nam G VU

1
@NGGVU Komuta dikkat edin, workonherhangi bir dizinden çalışır.
igaurav

1
Başka bir gönderinin yorumunda belirtildiği gibi (ve Stackoverflow'un bunu göstermenin pratik bir yolu yoktur) deactivate, önce bu işlevi tanımlayan komut dosyasını kaynaklamadan bir kabuk komut dosyasında kullanamazsınız (bu durumda bu komutu bulamazsınız. ( hata)
Mariano Ruiz

4

Yana deactivatekaynak yarattığı fonksiyon ~/bin/activateböyle bir komutun arayan olağan yollarla keşfedilen olamaz ~/bin, sadece işlevini yürütür tane oluşturmak isteyebilirsiniz deactivate.

Sorun, deactivatetek bir komut içeren bir komut dosyasının deactivate, venv'de değilken yanlışlıkla çalıştırılması durumunda sonsuz bir döngüye neden olmasıdır. Yaygın bir hata.

Bu, yalnızca deactivateişlev mevcutsa (yani kaynak ile oluşturulmuşsa activate) yürütülerek önlenebilir .

#!/bin/bash

declare -Ff deactivate  && deactivate

3

Kullanın deactivate.

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

Not, (my_env)gitti.


2

Kullandığım zsh-autoenv kapalı dayanır autoenv .

zsh-autoenv.autoenv.zsh , genellikle proje kök dizinlerinde kullanılan dosyaları (bilinen / beyaz listedeki) otomatik olarak kaynaklar . Olayları "enter" ve leave ", değişkenlerin iç içe yerleştirilmesi ve saklanması (üzerine yazma ve geri yükleme) işlemlerini gerçekleştirir.

İşte bir örnek:

; 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

Dizinden ayrıldığımda dtreesanal ortamdan otomatik olarak çıkılıyor.

"Development tree utiles" sadece bir isim… Burada İlluminati ile bağlantı kurmak için gizli bir anlamı yok.


1

deactivateVen'in activatekomut dosyası tarafından sağlanan özelliği kullanmak, yalnızca orijinal etkinleştirmeyi değil , aynı zamanda herhangi bir anahtarı , yapılandırmayı veya diğerlerini de dikkate alarak tüm ortam değişkenlerini daha önce olduğu gibi temiz bir şekilde sıfırlamak için devre dışı bırakma işlevinin düzgün bir şekilde kodlandığına güvenmenizi gerektirir. bu arada yapmış olabileceğiniz işler .

Muhtemelen iyidir, ancak daha sonra ortamınızı değiştirmeden sıfırdan yeni bir risk ortaya çıkarır.

Bir süreç doğrudan kendi ebeveyn Ortam değişkenlerini değiştirmek için Bununla birlikte, teknik olarak mümkün değildir biz kesinlikle emin olmak için ayrı bir alt kabuk kullanabilmesi bizim venvler arkasında kalan değişiklikleri bırakmazlar:


Etkinleştirmek:

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

  • Bu yeni bir kabuk başlar venv. Orijinal bashkabuğunuz değiştirilmeden kalır.

Devre dışı bırakmak için:

$ exitVEYA [CTRL]+[D]

  • Bu, venvbulunduğu kabuğun tamamından çıkar ve etkinleştirme komut dosyası ortam üzerinde herhangi bir değişiklik yapmadan önce sizi özgün kabuğa geri bırakır.

Misal:

[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

Bir yükleyici komut dosyası üzerinde çalışırken aynı sorunu yaşadım. Ben bin / activ_this.py ne yaptı bir göz attım ve ters.

Misal:

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

İstendiği gibi çalışıp çalışmadığından% 100 emin değilim. Bir şeyi tamamen özlemiş olabilirim.


2
devre dışı bırakma, ortam yolu, sistem yolu, varsayılan bilgi istemi değerini sıfırlarsa, devre dışı bırakma işleviniz iyi bir yaklaşımdır. Senaryonuzu seviyorum. Zaten +1 verildi.
Ramkumar D
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.