วิธีออก / ออก / ปิดใช้งาน Pen virtualenv


1607

ฉันใช้ virtualenv และ virtualenvwrapper ฉันสามารถสลับระหว่าง virtualenv ได้โดยใช้workonคำสั่ง

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

ฉันจะออกจากเครื่องเสมือนทั้งหมดและทำงานบนเครื่องจริงของฉันอีกครั้งได้อย่างไร ตอนนี้วิธีเดียวที่ฉันจะกลับไปที่me@mymachine:~$นั่นคือออกจากเปลือกและเริ่มใหม่ มันช่างน่ารำคาญ มีคำสั่งให้ทำงานกับ "ไม่มีอะไร" และถ้าเป็นเช่นนั้นมันคืออะไร? หากไม่มีคำสั่งดังกล่าวฉันจะสร้างมันอย่างไร?


5
มีคำสั่งให้ทำงานกับ "ไม่มีอะไร" - มันจะแสดงสภาพแวดล้อมเสมือนจริงทั้งหมดของคุณซึ่งค่อนข้างดี เพียงพิมพ์ "workon" โดยไม่มีข้อโต้แย้งและกด Enter คำสั่งที่จะออกคือ "ปิดใช้งาน" ตามที่ตอบไว้ด้านล่าง
Dannid

คำตอบ:


2595

โดยปกติแล้วการเปิดใช้งาน virtualenv จะให้ชื่อฟังก์ชันของเชลล์:

$ deactivate

ซึ่งทำให้สิ่งต่าง ๆ กลับสู่ปกติ

ฉันเพิ่งดูรหัสเฉพาะอีกครั้งvirtualenvwrapperและใช่มันก็รองรับdeactivateเป็นวิธีที่จะหนีจาก virtualenv ทั้งหมด

หากคุณพยายามที่จะออกจากสภาพแวดล้อมของAnacondaคำสั่งจะขึ้นอยู่กับรุ่นของcondaคุณ รุ่นล่าสุด (เช่น 4.6) ติดตั้งcondaฟังก์ชั่นโดยตรงในเปลือกของคุณซึ่งในกรณีที่คุณเรียกใช้:

conda deactivate

เวอร์ชัน Conda ที่เก่ากว่าใช้การปิดการทำงานโดยใช้สคริปต์แบบสแตนด์อะโลน:

source deactivate

126
คำสั่ง "ปิดใช้งาน" ไม่ใช่ไบนารีหรือสคริปต์ที่คุณ "ซอร์ส" มันเป็นชื่อแทนเชลล์ที่ได้รับการกำหนดแบบไดนามิกในเชลล์ปัจจุบันของคุณโดยสคริปต์ "เปิดใช้งาน"
แบรนดอนโรดส์

6
@Areche ในระหว่างนี้ (เกือบสี่ปีต่อมา) สิ่งนี้ดูเหมือนจะถูกเพิ่มเข้าไปในเอกสาร
gertvdijk

6
จะง่ายกว่านี้มากถ้าเรียกว่า "workoff" หรือ "unworkon" หรือถ้าเรียกว่า "workon" ถูกเรียกว่า "activate" ขอบคุณพระเจ้าสำหรับนามแฝง
kkurian

4
@kkurian - คุณควรแนะนำว่าในการติดตามปัญหาvirtualenvwrapperและบางทีดั๊ก Hellmann จะพิจารณามัน! หมายเหตุสำหรับผู้ที่อาจจะอ่านความคิดเห็นเหล่านี้ในภายหลังว่าworkonเป็นไม่พื้นเมืองvirtualenvคำสั่ง (ซึ่งเป็นสิ่งที่คำถามเดิมเป็นเรื่องเกี่ยวกับ) แต่virtualenvwrapperคำสั่ง!
Brandon Rhodes

17
เดาคำสั่ง virtualenv ที่เกิดขึ้นจริงภายใน "workon" เรียกว่าอะไร? ... (คำเตือนสปอยเลอร์) ... ... (คำเตือนสปอยเลอร์) ... ... (คำเตือนสปอยเลอร์) ... ... (คำเตือนสปอยเลอร์) ... ... เปิดใช้งาน!
FutureNerd

53

ฉันได้กำหนดนามแฝง , workoffเป็นตรงข้ามของworkon :

alias workoff='deactivate'

ง่ายต่อการจดจำ:

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

1
ไฟล์ไหน? .bashrc?
seyed

@seyed ใช่ดูคำตอบนี้สำหรับตัวอย่างของนามแฝงใน~/.bashrc
Bob Stein

21
ฉันชอบนามแฝงนี้ เตือนฉันถึงคาราเต้คิด (waxon; waxoff)
C0deH4cker

@ C0deH4cker: ฉันลงชื่อเข้าใช้ดังนั้นและกลับมาที่คำถามนี้เพื่อ +1 ความคิดเห็นของคุณ: p
pooley1994

ฮ่า ๆ ฉันกำลังคิด (clap-on; clap-off) ฉันเดาว่าเราสามารถรวม (กระตุก
Edison

53

ใช้:

$ deactivate 

หากวิธีนี้ใช้ไม่ได้ให้ลอง

$ source deactivate

ทุกคนที่รู้วิธีการทุบตีsourceงานจะคิดว่าแปลก แต่บางห่อ / เวิร์กโฟลว์รอบ virtualenv ใช้มันเป็นส่วนประกอบ / source activateคู่ไป ไมล์สะสมของคุณอาจแตกต่างกันไป


7
deactivateเป็นฟังก์ชั่นที่สร้างขึ้นเมื่อคุณส่งactivateไฟล์ ข้อเสนอแนะของคุณที่จะทำsource deactivateไม่สมเหตุสมผลเลยเนื่องจากไม่มีไฟล์ชื่อdeactivate
Anthon

7
สิ่งนี้ไม่สมควรได้รับ downvotes ดูการแก้ไขการตอบกลับที่เลือก: การปิดการใช้งานซอร์สสำหรับสภาพแวดล้อมแบบอนาคอนดา
Doug Bradshaw

2
มัน "สมควร" downvotes ที่ไม่เป็นไปตามมาตรฐานคุณภาพของคำตอบ มันเป็นความคิดเห็นมากกว่าคำตอบ แต่เนื่องจากโปสเตอร์ 79 ชื่อเสียงเราควรจะดีและให้ข้อเสนอแนะที่ดี
Bruno Bronosky

@Abdul ฉันได้สาธิตวิธีที่คุณสามารถปรับปรุงคุณภาพคำตอบของคุณใน Revision 2 ได้ที่stackoverflow.com/posts/29586756/revisions
Bruno Bronosky

สิ่งนี้จะไม่ช่วยเหลือหากคุณไม่มีคำสั่งปิดการใช้งานในเชลล์ ฉันไม่เข้าใจจริงๆว่าทำไมสิ่งนี้จะช่วยแก้ปัญหาได้ ไม่มีสคริปต์ปิดใช้งานใน env เสมือน
bgenchel

19

ในการเปิดใช้งานสภาพแวดล้อมเสมือน Python:

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

วิธีปิดใช้งาน:

$deactivate

3
ในเทอร์มินัลใน OS X10.11.1 ดูเหมือนว่าฉันจะต้องใช้:$source activate
Eric Milliot-Martinez

ฉันไม่ต้องการแหล่งที่มา ผมไม่$cd /to/dir/i/want/my/virtualenv/installedแล้ว$virtualenv name_i_want_for_itแล้ว$. name_i_want_for_it/bin/activatevirtualenv ยังคงดูเหมือนว่าบิตออกไปฉัน จำเป็นต้องได้รับการปรับปรุง ...
uchuugaka

3
"source" เหมือนกับ "." คำสั่ง .. สามารถใช้เพื่อแหล่งไฟล์
Corey Goldberg

11

ฉันพบว่าเมื่ออยู่ในสภาพแวดล้อม Miniconda3 ฉันต้องทำงาน:

conda deactivate

ทั้งdeactivateมิได้source deactivateทำงานให้ฉัน


1
deactivate สำหรับ virtualenvและsource deactivateมีไว้สำหรับ conda เก่าบน Linux conda deactivateเป็นวิธีข้ามแพลตฟอร์มที่ดีสำหรับ condv envs (ไม่ใช่ virtualenvs)
Tomasz Gandor

6

คุณสามารถใช้ในการสั่งซื้อเพื่อความสะดวกในวิธีการที่คุณทำงานกับvirtualenvwrappervirtualenv

การติดตั้งvirtualenvwrapper:

pip install virtualenvwrapper

หากคุณกำลังใช้เปลือกมาตรฐานเปิดของคุณ~/.bashrcหรือ~/.zshrcถ้าคุณใช้Oh My zsh เพิ่มสองบรรทัดเหล่านี้:

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ในเชลล์สคริปต์โดยไม่ได้ทำการจัดหาสคริปต์ที่กำหนดฟังก์ชันนี้ก่อน (ในกรณีนี้คุณจะไม่พบคำสั่งนั้น.. . error)
Mariano Ruiz

4

เนื่องจากdeactivateฟังก์ชั่นที่สร้างขึ้นโดย sourcing ~/bin/activateไม่สามารถค้นพบได้โดยวิธีปกติในการค้นหาคำสั่งดังกล่าว~/binคุณอาจต้องการสร้างฟังก์ชันที่เพิ่งเรียกใช้ฟังก์ชันdeactivateคุณอาจต้องการที่จะสร้างที่เพิ่งรันฟังก์ชั่น

ปัญหาคือสคริปต์ชื่อdeactivateที่มีคำสั่งเดียวdeactivateจะทำให้เกิดการวนซ้ำไม่รู้จบหากดำเนินการโดยไม่ตั้งใจในขณะที่ไม่ได้อยู่ใน venv ข้อผิดพลาดทั่วไป

สิ่งนี้สามารถหลีกเลี่ยงได้โดยการดำเนินการdeactivateหากฟังก์ชันนั้นมีอยู่ (เช่นถูกสร้างขึ้นโดยการจัดหาactivate)

#!/bin/bash

declare -Ff deactivate  && deactivate


2

ผมใช้zsh-autoenvซึ่งจะตามออกautoenv

zsh-autoenv ไฟล์ที่มา (รู้จัก / ปลอดภัย) โดยอัตโนมัติ.autoenv.zshมักใช้ในไดเรกทอรีรากของโครงการ มันจัดการ "ป้อน" และออกจาก "เหตุการณ์การทำรังและ stashing ของตัวแปร (เขียนทับและเรียกคืน)

นี่คือตัวอย่าง:

; 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

ใช้deactivateคุณลักษณะให้โดย venv ของactivateสคริปต์คุณจะต้องไว้วางใจฟังก์ชั่นการเสื่อมที่จะเขียนอย่างถูกต้องเรียบร้อยรีเซ็ตตัวแปรสภาพแวดล้อมทั้งหมดกลับไปว่าพวกเขากำลังมาก่อนเข้าบัญชีไม่ได้เป็นเพียงการเปิดใช้งานเดิมแต่ยังใด ๆ ที่สวิทช์ , การกำหนดค่าหรืออื่น ๆ งานที่คุณอาจทำในระหว่างนี้

มันอาจจะดี แต่มันจะแนะนำความเสี่ยงแบบใหม่และไม่เป็นศูนย์ในการปรับสภาพแวดล้อมของคุณในภายหลัง

อย่างไรก็ตามกระบวนการทางเทคนิคไม่สามารถเปลี่ยนแปลงตัวแปรสภาพแวดล้อมของพาเรนต์ได้โดยตรงดังนั้นเราจึงสามารถใช้ sub-shell แยกเพื่อให้แน่ใจว่าเรา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
หากปิดการใช้งานรีเซ็ตค่าของสภาพแวดล้อมเส้นทางระบบพร้อมท์เริ่มต้นแล้วฟังก์ชั่นการปิดการใช้งานของคุณเป็นวิธีที่ดี ฉันชอบสคริปต์ของคุณ ได้รับ +1 แล้ว
Ramkumar D
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.