วิธีที่เหมาะสมในการติดตั้ง pip, virtualenv และแจกจ่ายให้กับ Python คืออะไร


247

คำถามสั้น ๆ

  • อะไรคือวิธีการที่เหมาะสมในการติดตั้งpip, virtualenvและdistribute?

พื้นหลัง

ในคำตอบของฉันไปดังนั้นคำถาม 4314376ผมแนะนำให้ใช้ez_setupเพื่อให้คุณแล้วสามารถติดตั้งpipและการvirtualenvดังนี้

curl -O http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip
sudo pip install virtualenv

ฉันได้ดึงคำแนะนำเหล่านี้จากโพสต์บล็อกของ Jesse Noller แล้วคุณต้องการใช้ Python บน Mac หรือไม่? . ผมชอบความคิดของการรักษาความสะอาดทั่วโลกไดเรกทอรีเว็บไซต์แพคเกจเพื่อให้แพคเกจอื่น ๆ เท่านั้นที่ผมติดตั้งมี และvirtualenvwrapper distribute(ฉันเพิ่งเพิ่มลงdistributeในกล่องเครื่องมือของฉันเนื่องจากการประกาศการบริการสาธารณะ Python นี้เมื่อต้องการติดตั้งสองแพ็คเกจนี้ฉันใช้:

sudo pip install virtualenvwrapper
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py

ไม่มี setuptools และ easy_install อีกต่อไป

ในการปฏิบัติตามประกาศการบริการสาธารณะ Python ที่ติดตั้ง Python ใหม่ฉันจะทำสิ่งต่อไปนี้:

curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
sudo easy_install pip
sudo pip install virtualenv
sudo pip install virtualenvwrapper

คำตำหนิของร่ายมนตร์

ในความคิดเห็นที่คำตอบของฉันไปดังนั้นคำถาม 4314376ผู้ใช้ดังนั้นสัญลักษณ์ระบุ:

NO ไม่เคยทำsudo python setup.py installอะไรเลย เขียน ~ / .pydistutils.cfg ที่ทำให้การติดตั้ง pip ของคุณเป็น ~ / .local หรืออะไรบางอย่าง โดยเฉพาะอย่างยิ่งไฟล์ที่ez_setup.pyมีชื่อมักจะทำให้ไฟล์เวอร์ชั่นใหม่ ๆ เช่น setuptools และ easy_install ซึ่งอาจทำลายสิ่งอื่น ๆ บนระบบปฏิบัติการของคุณ

กลับไปที่คำถามสั้น ๆ

ดังนั้นคำตอบของ glyphทำให้ฉันมีคำถามเดิม

  • อะไรคือวิธีการที่เหมาะสมในการติดตั้งpip, virtualenvและdistribute?

Matthew ฉันรู้ว่ากระทู้นี้ค่อนข้างเก่า แต่มีอะไรใหม่ในหน้านี้? ก็ยังคงเป็นความคิดที่ดีที่จะทำpython distribute_setup.pyตามeasy_install pipและvirtualenv --distribute venv? (ดูpython-guide.readthedocs.org/en/latest/starting/install/… ) และถ้าเป็นเช่นนั้นทำไม
Amelio Vazquez-Reina

2
เกิดอะไรขึ้นกับsudo apt-get install python-{pip,virtualenv}???
MestreLion

1
ใช่โดยทั่วไปแพ็คเกจที่เก่ากว่า แต่ใช้งานร่วมกันได้ดีเมื่อรุ่นรองไม่สำคัญสำหรับวัตถุประสงค์ของคุณ แต่คุณถามโดยเฉพาะ "มีอะไรผิดปกติ" และฉันพยายามรับตราคนอวดรู้ของฉัน

2
FYI, การเชื่อมโยงในหลายคำถามนี้จะล้าสมัยในขณะนี้ / เสีย - ฉันปัจจุบัน (ไม่สามารถ) ดูว่าคนที่จะpip, virtualenvและงูหลาม PSA
Chris Sprague

1
http://python-distribute.org/distribute_setup.pyเปลี่ยนเส้นทางไปที่ 404 :(
jitter

คำตอบ:


173

คุณสามารถทำได้โดยไม่ต้องติดตั้งอะไรลงในหลามเอง

คุณไม่ต้องการ sudo หรือสิทธิพิเศษใด ๆ

คุณไม่จำเป็นต้องแก้ไขไฟล์ใด ๆ

ติดตั้ง virtualenv ลงในสภาพแวดล้อมเสมือน bootstrap ใช้สภาพแวดล้อมเสมือนนั้นเพื่อสร้างมากขึ้น เนื่องจาก virtualenv มาพร้อมกับ pip และแจกจ่ายคุณจะได้รับทุกสิ่งจากการติดตั้งครั้งเดียว

  1. ดาวน์โหลด virtualenv:
  2. แกะ tarball ต้นทางออก
  3. ใช้ tarball ที่คลายการแพคเพื่อสร้างสภาพแวดล้อมเสมือนที่สะอาดตา สภาพแวดล้อมเสมือนนี้จะถูกใช้เพื่อ "bootstrap" อื่น ๆ สภาพแวดล้อมเสมือนจริงทั้งหมดของคุณจะมี pip และแจกจ่ายโดยอัตโนมัติ
  4. ใช้ pip ติดตั้ง virtualenv ในสภาพแวดล้อม bootstrap นั้น
  5. ใช้สภาพแวดล้อม bootstrap เพื่อสร้างมากขึ้น!

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

# Select current version of virtualenv:
VERSION=12.0.7
# Name your first "bootstrap" environment:
INITIAL_ENV=bootstrap
# Set to whatever python interpreter you want for your first environment:
PYTHON=$(which python)
URL_BASE=https://pypi.python.org/packages/source/v/virtualenv

# --- Real work starts here ---
curl -O $URL_BASE/virtualenv-$VERSION.tar.gz
tar xzf virtualenv-$VERSION.tar.gz
# Create the first "bootstrap" environment.
$PYTHON virtualenv-$VERSION/virtualenv.py $INITIAL_ENV
# Don't need this anymore.
rm -rf virtualenv-$VERSION
# Install virtualenv into the environment.
$INITIAL_ENV/bin/pip install virtualenv-$VERSION.tar.gz

ตอนนี้คุณสามารถใช้สภาพแวดล้อม "bootstrap" เพื่อสร้างเพิ่มเติม:

# Create a second environment from the first:
$INITIAL_ENV/bin/virtualenv py-env1
# Create more:
$INITIAL_ENV/bin/virtualenv py-env2

ไปถั่ว!

บันทึก

สิ่งนี้ถือว่าคุณไม่ได้ใช้ virtualenv รุ่นเก่าจริงๆ เวอร์ชันเก่าต้องการแฟล็ก--no-site-packges(และขึ้นอยู่กับเวอร์ชันของ Python --distribute) ตอนนี้คุณสามารถสร้างสภาพแวดล้อมการบูตของคุณมีเพียงหรือpython virtualenv.py path-to-bootstrappython3 virtualenv.py path-to-bootstrap


13
น่าเบื่อเพียงเพราะมันเป็นเรื่องธรรมดามากดาวน์โหลดง่าย ๆpython virtualenv.py TARGET_DIRECTORYไม่เคยทำมาก่อนแล้วก็ทำสิ่งเดียวกัน
Sebastian Blask

3
อันนี้ยอดเยี่ยม ฉันปรับมันเพื่อตอบคำถามที่เจาะจงยิ่งขึ้นเกี่ยวกับการติดตั้ง virtualenv ใน Python หลายเวอร์ชันโดยไม่ขึ้นกับแพ็คเกจระบบ - stackoverflow.com/questions/6812207/… - ทำงานได้อย่างสมบูรณ์แบบ
david.libremone

6
หมายเหตุ: ปัจจุบันvirtualenvไม่ต้องการตัวเลือก '--no-site-packages - แจกจ่าย' สิ่งที่ตรงกันข้าม--system-site-packagesอาจจำเป็น
jfs

1
คุณสามารถรับ tarball ที่เสถียรล่าสุดได้ด้วยคำสั่งนี้:curl -Lo virtualenv-tmp.tar.gz 'https://github.com/pypa/virtualenv/tarball/master'
Bohr

1
ติดตั้งvirtualenvwrapperที่ไหน เอกสารเตือนไม่ให้ติดตั้งใน virtualenv โดยเฉพาะ ( ดูเหมือนว่าจะใช้งานได้ )
Aryeh Leib Taurog

21

ฉันคิดว่าสัญลักษณ์หมายถึงทำอะไรเช่นนี้:

  1. สร้างไดเรกทอรี~/.localหากยังไม่มีอยู่
  2. ในของคุณ~/.bashrcให้แน่ใจว่า~/.local/binอยู่ในPATHและที่อยู่บน~/.localPYTHONPATH
  3. สร้างไฟล์~/.pydistutils.cfgที่มี

    [install]
    prefix=~/.local

    เป็นไฟล์รูปแบบมาตรฐานของ ConfigParser

  4. ดาวน์โหลด distribute_setup.pyและเรียกใช้python distribute_setup.py(ไม่sudo) ถ้ามันบ่นเกี่ยวกับsite-packagesไดเรกทอรีที่ไม่มีอยู่สร้างด้วยตนเอง:

    mkdir -p ~ / .local / lib / python2.7 / site-packages /

  5. เรียกใช้which easy_installเพื่อยืนยันว่ามาจากไหน~/.local/bin

  6. วิ่ง pip install virtualenv
  7. วิ่ง pip install virtualenvwrapper
  8. สร้างโฟลเดอร์ env เสมือนที่ประกอบด้วย ~/.virtualenvs
  9. ในการ~/.bashrcเพิ่ม

    export WORKON_HOME
    source ~/.local/bin/virtualenvwrapper.sh

ไม่ต้องใช้sudoอะไรเลยและสภาพแวดล้อม Python ของคุณก็~/.localแยกออกจาก Python ของระบบปฏิบัติการโดยสิ้นเชิง Disclaimer: ไม่แน่ใจว่าเข้ากันได้virtualenvwrapperในสถานการณ์นี้ - ฉันไม่สามารถทดสอบในระบบของฉัน :-)


2
~ / .local บิตของชื่อโง่หรือไม่? เกิดอะไรขึ้นถ้าทับทิมต้องการทำเช่นเดียวกัน? อาจจะ ~ / .python27 ดีกว่าไหม
Jonathan Hartley

1
เพิ่งทราบฉันเพิ่งลองสิ่งเดียวกันบน Windows และต้องเพิ่มทั้งโฟลเดอร์ในเครื่อง (เรียกว่า "local" เป็นต้น) และ "local \ Lib \ site-packages" ไปยัง PYTHONPATH เพื่อให้สามารถเรียกใช้ Distribut_setup.py ได้สำเร็จ
technomalogical

1
ปัญหาสุดท้ายอย่างหนึ่งของวิธีการนี้: virtualenv เข้ากันไม่ได้กับการใช้ไฟล์. pydistutils.cfg ดูgithub.com/pypa/virtualenv/issues/88
Dan

3
ผมคิดว่าควรจะมีeasy_install pipระหว่างขั้นตอนที่ 5 และ 6
SiggyF

5
สิ่ง ~ / .local มาจาก PEP 370
Éric Araujo

16

หากคุณทำตามขั้นตอนที่แนะนำในแบบฝึกหัดหลายข้อที่ฉันเชื่อมโยงในคำตอบนี้คุณสามารถรับเอฟเฟกต์ที่ต้องการได้โดยไม่ต้องใช้ขั้นตอน "คู่มือ" ที่ซับซ้อนในคำตอบของ Walker's และ Vinay หากคุณใช้ Ubuntu:

sudo apt-get install python-pip python-dev

สามารถเทียบเท่าได้ใน OS X โดยใช้ homebrew เพื่อติดตั้ง python (รายละเอียดเพิ่มเติมที่นี่ )

brew install python

เมื่อpipติดตั้งแล้วคุณสามารถใช้มันเพื่อรับแพ็คเกจที่เหลืออยู่ (คุณสามารถละเว้นsudoใน OS X ได้เช่นเดียวกับที่คุณใช้การติดตั้งหลามแบบโลคัล)

sudo pip install virtualenvwrapper

(นี่เป็นแพ็คเกจเดียวที่คุณต้องติดตั้งทั่วโลกและฉันสงสัยว่ามันจะขัดแย้งกับอะไรในระดับระบบจากระบบปฏิบัติการหากคุณต้องการความปลอดภัยสูงคุณสามารถใช้เวอร์ชั่นของ distro ได้sudo apt-get install virtualenvwrapper)

หมายเหตุ:ใน Ubuntu 14.04 ฉันได้รับข้อผิดพลาดในการติดตั้ง pipดังนั้นฉันจึงใช้pip3 install virtualenv virtualenvwrapperและเพิ่มไฟล์VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3ของฉัน.bashrc/.zshrc

จากนั้นคุณผนวก.bashrcไฟล์ของคุณ

export WORKON_HOME
source /usr/local/bin/virtualenvwrapper.sh

และแหล่งมัน

. ~/.bashrc

นี่เป็นพื้นมัน ตอนนี้การตัดสินใจเพียงอย่างเดียวคือคุณต้องการสร้าง virtualenv เพื่อรวมแพ็คเกจระดับระบบหรือไม่

mkvirtualenv --system-site-packages foo

แพคเกจระบบที่มีอยู่ของคุณไม่จำเป็นต้องติดตั้งใหม่แพคเกจเหล่านี้จะเชื่อมโยงกับเวอร์ชันของล่ามระบบ หมายเหตุ:คุณยังคงสามารถติดตั้งแพ็กเกจใหม่และอัพเกรดแพ็คเกจที่รวมอยู่จากระบบได้โดยไม่ต้องใช้ sudo - ฉันทำการทดสอบและใช้งานได้โดยไม่มีการหยุดชะงักของล่ามระบบ

kermit@hocus-pocus:~$ sudo apt-get install python-pandas
kermit@hocus-pocus:~$ mkvirtualenv --system-site-packages s
(s)kermit@hocus-pocus:~$ pip install --upgrade pandas
(s)kermit@hocus-pocus:~$ python -c "import pandas; print(pandas.__version__)"
0.10.1
(s)kermit@hocus-pocus:~$ deactivate
kermit@hocus-pocus:~$ python -c "import pandas; print(pandas.__version__)"
0.8.0

ทางเลือกถ้าคุณต้องการสภาพแวดล้อมที่แยกจากกันโดยสิ้นเชิงคือ

mkvirtualenv --no-site-packages bar

หรือระบุว่านี่เป็นตัวเลือกเริ่มต้นเพียง

mkvirtualenv bar

ผลลัพธ์คือคุณมี virtualenv ใหม่ที่คุณสามารถติดตั้งแพ็คเกจที่คุณชื่นชอบได้อย่างอิสระ

pip install flask

สิ่งนี้ไม่ได้ติดตั้งทั้ง setuptools และแจกจ่ายใช่ไหม และนั่นไม่ทำลายแพ็คเกจเช่น Tkinter และ pyopencl ที่ไม่ชอบ setuptools
เตาแก๊ส

การตั้งค่า WORKON_HOME เป็นโมฆะใน bashrc บังคับให้ venvwrapper ใช้สิ่งที่สมเหตุสมผลexport WORKON_HOME="$HOME/.virtualenvs"ไหม
เตาแก๊ส

มันจะทำการติดตั้งตามที่ผู้จัดการแพ็คเกจบอกไว้ ขณะนี้นั่นคือ setuptools ในUbuntuและ OS X ( brew install pythonดึง pip + setuptools ใน) วิธีนี้ใช้ได้ผลดีสำหรับฉัน นอกจากนี้การมุ่งเน้นไปที่ pip ดูเหมือนจะเป็นเส้นทางในอนาคตในบรรจุภัณฑ์ Python ด้วย
metakermit

1
WORKON_HOMEเริ่มต้นที่~/.virtualenvsใช่ มีบรรทัดใน/usr/local/bin/virtualenvwrapper.shชุดworkon_home_dir="$HOME/.virtualenvs" if [ "$workon_home_dir" = "" ]นั้น
metakermit

เข้าใจแล้ว ขอบคุณ วิธีการง่าย ๆ ของคุณใช้งานได้ดีสำหรับฉันบน Ubuntu 12.04 เมื่อ pip ติดตั้งโมดูลที่พิถีพิถันในการใช้การกระจาย (pyopencl) เคล็ดลับสำหรับฉันคือการติดตามpip install virtualenv virtualenv-wrapperสายของคุณด้วยpip install --upgrade distributevirtualenv ที่เปิดใช้งานซึ่งฉันติดตั้ง pyopencl แล้วฉันยังเพิ่มexport PROJECT_HOME="$HOME/src"bashrc ของฉันเพื่อเปิดใช้งานmkprojectเครื่องมือ venv ที่เยี่ยมยอด
เตาแก๊ส

12

Python 3.4 เป็นต้นไป

งูหลาม 3.3 เพิ่มโมดูล venvและงูหลาม 3.4 เพิ่มโมดูล ensurepip สิ่งนี้ทำให้ pip bootstrapping ง่ายเหมือน:

หลาม -m surepip

อาจนำหน้าด้วยการเรียกvenvให้ทำภายในสภาพแวดล้อมเสมือน

รับประกัน pip อธิบายไว้ในPEP 453


10

บน Ubuntu:

sudo apt-get install python-virtualenv

แพคเกจpython-pipเป็นการอ้างอิงดังนั้นมันจะถูกติดตั้งเช่นกัน


1
python-virtualenv จะติดตั้งทั้ง virtualenv และ pip หลังจากนั้นเรียกใช้ virtualenv เพื่อสร้างสภาพแวดล้อมเสมือน Python และเรียกใช้ pip จากภายใน env เสมือนเพื่อติดตั้งแพ็คเกจอื่น ๆ
jemeshsu

2
นี่เป็นตัวเลือกที่ปลอดภัยที่สุด วิธีที่ "เหมาะสม" ในการติดตั้งสิ่งต่าง ๆ ในระบบปฏิบัติการของคุณคือการใช้ระบบติดตั้งระบบปฏิบัติการของคุณ ! หลังจากนั้นคุณสามารถเล่นกับpipโดยเฉพาะอย่างยิ่งในvirtualenvและไม่เคยใช้sudoทั้ง
MestreLion

น่าเสียดายที่pipบางครั้งระบบปฏิบัติการที่ให้บริการมีข้อบกพร่องที่สำคัญดังนั้นฉันมักจะลงเอยด้วยการใช้งานที่get-pip.pyระบุไว้ใน python.org
RichVel

@RichVel คุณสามารถอธิบายรายละเอียดข้อบกพร่องที่สำคัญที่คุณพบได้อย่างไร
danielpops

1
@danielpops - ตัวอย่างหนึ่งคือปัญหา pipใน Ubuntu 16.04.1 แต่อาจมีปัญหาอื่น ๆ กับบางรุ่นและใช้เคส
RichVel

5

ฉันทำขั้นตอนนี้เพื่อให้เราใช้ในที่ทำงาน

cd ~
curl -s https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz | tar xvz
cd pip-1.3.1
python setup.py install --user
cd ~
rm -rf pip-1.3.1

$HOME/.local/bin/pip install --user --upgrade pip distribute virtualenvwrapper

# Might want these three in your .bashrc
export PATH=$PATH:$HOME/.local/bin
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS="--distribute"
source $HOME/.local/bin/virtualenvwrapper.sh

mkvirtualenv mypy
workon mypy
pip install --upgrade distribute
pip install pudb # Or whatever other nice package you might want.

ประเด็นสำคัญสำหรับการรักษาความปลอดภัยใจ:

  1. curl ทำการตรวจสอบ SSL ไม่ได้
  2. เริ่มต้นจาก pip 1.3.1 pip ยังทำการตรวจสอบ SSL ด้วย
  3. ผู้ใช้ที่น้อยลงสามารถอัปโหลด pypi tarball ได้มากกว่า Github tarball

5

อัปเดต:ณ เดือนกรกฎาคม 2556 โครงการนี้ไม่ได้รับการดูแลรักษาอีกต่อไป ผู้เขียนแนะนำให้ใช้pyenv (pyenv ไม่มีการสนับสนุน virtualenv ในตัว แต่เล่นได้ดีกับมัน)

Pythonbrewเป็นเครื่องมือจัดการเวอร์ชันสำหรับ python และมาพร้อมกับการสนับสนุน virtualenv

หลังจากติดตั้ง pythonbrew และ python-version โดยใช้ venvs เป็นเรื่องง่าย:

# Initializes the virtualenv 
pythonbrew venv init

# Create a virtual/sandboxed environment 
pythonbrew venv create mycoolbundle  

# Use it 
pythonbrew venv use mycoolbundle

@ kermit666 ขอบคุณ อะไรคือวิธีที่ดีกว่าในการทำเครื่องหมายคำตอบของฉันว่าล้าสมัย? แค่ลบมัน?
kioopi

1
ดีคุณสามารถทิ้งไว้ได้เหมือนเดิม (มีคำแนะนำในการใช้ pyenv สำหรับผู้ที่ติดตามลิงก์จากความคิดเห็นของฉันซึ่งคล้ายกับแนวคิดของ pythonbrew ที่คุณแนะนำ) หรือแก้ไขคำตอบด้วยเช่นอัปเดตกันยายน 2013โดย ต่อท้ายคำแนะนำใหม่ บางที pythonbrew จะเปิดใช้งานอีกครั้งในอนาคตดังนั้นฉันจะไม่ลบคำแนะนำเก่าของคุณ สำหรับข้อมูลเพิ่มเติมโปรดดูที่เมตา
metakermit

ดูคำตอบของฉันเกี่ยวกับpyenvซึ่งทำงานได้ดี
RichVel

3

ไม่มีปัญหาในการติดตั้ง sudo python setup.py หากคุณแน่ใจว่าเป็นสิ่งที่คุณต้องการ

ความแตกต่างคือจะใช้ไดเรกทอรีไซต์แพ็กเกจของระบบปฏิบัติการของคุณเป็นปลายทางสำหรับไฟล์. py ที่จะคัดลอก

ดังนั้นถ้าคุณต้องการให้ pip สามารถใช้งานได้กับระบบปฏิบัติการขนาดใหญ่นั่นอาจเป็นวิธีที่คุณควรทำ ฉันไม่ได้บอกว่าคนอื่นมีวิธีที่ไม่ดี แต่นี่อาจยุติธรรมพอสมควร


1
ใช่ฉันใช้วิธีนั้น และในเวลาต่อมาการเรียกใช้pip freezeทำให้ฉันเกือบจะแข็งแล้ว - รายการแพ็กเกจการติดตั้งระบบกว้างเกินไปยาวเกินไป ตั้งแต่นั้นมาฉันขอแนะนำให้ใช้การติดตั้งแพคเกจหลาม "no sudo" และ "no os-wide"
Jan Vlcinsky


2

ฉันเจอปัญหาเดียวกันเมื่อเร็ว ๆ นี้ ฉันกลายเป็นส่วนหนึ่งของความคิด“ ใช้ virtualenv” เสมอดังนั้นปัญหาของฉันคือการติดตั้ง virtualenv ด้วย pip โดยไม่ต้องติดตั้งแจกจ่ายไปยังไดเรกทอรีแพคเกจเว็บไซต์ผู้ใช้ทั่วโลกหรือของฉัน เมื่อต้องการทำสิ่งนี้ฉันดาวน์โหลดการแจกจ่าย pip และ virtualenv ด้วยตนเองและสำหรับแต่ละฉันฉันเรียกใช้ "python setup.py ติดตั้ง - คำนำหน้า ~ / .local / python-private" (ด้วยการตั้งค่าชั่วคราวของ PYTHONPATH = ~ / .local / หลาม - ส่วนตัว) เพื่อให้สคริปต์การติดตั้งสามารถค้นหาแจกจ่าย) ฉันย้ายสคริปต์ virtualenv ไปยังไดเรกทอรีอื่นที่ฉันมีบน PATH ของฉันและแก้ไขมันเพื่อให้โมดูลการแจกจ่ายและ virtualenv สามารถพบได้ใน sys.path ธาดา: ฉันไม่ได้ติดตั้งอะไรกับ / usr, / usr / local หรือแพ็คเกจเว็บไซต์ผู้ใช้ของฉัน dir แต่ฉันสามารถเรียกใช้ virtualenv ได้ทุกที่และใน virtualenv นั้นฉันได้รับ pip



2

ผมเคยมีปัญหาต่าง ๆ (ดูด้านล่าง) ติดตั้งโมดูล SSL อัพเกรดแม้ภายใน virtualenv ที่ด้านบนของ OS pyenvเก่าที่ให้รุ่นหลามดังนั้นตอนนี้ผมใช้

pyenvทำให้การติดตั้ง Python เวอร์ชั่นใหม่เป็นเรื่องง่ายและรองรับ virtualenvs การเริ่มต้นเป็นมากง่ายกว่าสูตรสำหรับ virtualenv ระบุไว้ในคำตอบอื่น ๆ :

  • บน Mac ให้พิมพ์brew install pyenvและบน Linux ให้ใช้pyenv-installer
  • สิ่งนี้ทำให้คุณได้รับการสนับสนุน virtualenv ในตัวเช่นเดียวกับการสลับรุ่น Python (ถ้าจำเป็น)
  • ทำงานได้ดีกับ Python 2 หรือ 3 สามารถติดตั้งได้หลายรุ่นพร้อมกัน

วิธีนี้ใช้งานได้ดีในการป้องกันเวอร์ชัน "Python ใหม่" และ virtualenv จากระบบ Python เนื่องจากคุณสามารถใช้ Python ล่าสุดได้ง่ายขึ้น (โพสต์ 2.7.9), โมดูล SSL ได้รับการอัพเกรดแล้วและแน่นอนเช่นการตั้งค่า virtualenv ที่ทันสมัยที่คุณได้รับการหุ้มฉนวนจากโมดูล Python ของระบบ

บทเรียนที่ดีสองข้อ:

pyenv-virtualenvปลั๊กอินที่ถูกสร้างขึ้นในขณะนี้ - ประเภทpyenv commands | grep virtualenvการตรวจสอบ ฉันจะไม่ใช้ปลั๊กอิน pyenv-virtualenvwrapper เพื่อเริ่มต้น - ดูว่าคุณจะได้รับอย่างไรกับ pyenv-virtualenv ซึ่งรวมเข้ากับ pyenv ได้มากขึ้นเนื่องจากนี่จะครอบคลุมสิ่งที่ virtualenvwrapper ทำส่วนใหญ่

pyenvเป็นแบบจำลองในrbenv(เครื่องมือที่ดีสำหรับการสลับรุ่น Ruby) และการพึ่งพาเพียงอย่างเดียวคือทุบตี

  • pyenv ไม่เกี่ยวข้องกับชื่อที่คล้ายกันมากpyvenv- นั่นคือ virtualenv ที่เทียบเท่าซึ่งเป็นส่วนหนึ่งของ Python 3 รุ่นล่าสุดและไม่ได้จัดการกับการสลับเวอร์ชั่น Python

คำเตือน

คำเตือนสองข้อเกี่ยวกับ pyenv:

  1. มันใช้งานได้จาก bash หรือ shell ที่คล้ายกัน - หรือเฉพาะเจาะจงกว่านั้นปลั๊กอิน pyenv-virtualenv ไม่ชอบdashซึ่งอยู่/bin/shใน Ubuntu หรือ Debian
  2. จะต้องมีการเรียกใช้จากเปลือกเข้าสู่ระบบแบบโต้ตอบ (เช่นbash --loginใช้ Terminal) ซึ่งไม่ได้เป็นเรื่องง่ายที่จะประสบความสำเร็จกับเครื่องมืออัตโนมัติเช่นเบิ้ล

ดังนั้น pyenv ที่ดีที่สุดสำหรับการใช้แบบโต้ตอบและไม่ดีสำหรับเซิร์ฟเวอร์สคริปต์

ปัญหาเกี่ยวกับโมดูล SSL

เหตุผลหนึ่งที่ใช้pyenvคือบ่อยครั้งที่มีปัญหากับการอัพเกรดโมดูล Python SSL เมื่อใช้เวอร์ชัน Python ที่ระบบให้มา:

  • Ubuntu 14.04 มี Python 2.7.6ซึ่งต้องใช้ความพยายามอย่างมากในการอัพเกรดเป็นโมดูล SSL ที่ถูกต้องดังนั้นจึงจัดการ SNI (การระบุชื่อเซิร์ฟเวอร์) เป็นไคลเอนต์ (ฉันเขียนสคริปต์ Ansible บางตัวสำหรับเรื่องนี้ซึ่งค่อนข้างเจ็บปวดและยังพังในบางกรณี)
  • โมดูล SSL ที่อัปเกรดแล้วจะมีความสำคัญมากกว่าเนื่องจากไซต์ Python.org จะย้ายไปที่ TLS 1.2 เฉพาะในช่วงปี 2560 และ 2018

2
  • คุณสามารถทำได้โดยไม่ต้องติดตั้งอะไรลงในหลามเอง

  • คุณไม่ต้องการ sudo หรือสิทธิพิเศษใด ๆ

  • คุณไม่จำเป็นต้องค้นหาvirtualenvไฟล์ tar เวอร์ชันล่าสุด

  • คุณไม่จำเป็นต้องแก้ไขข้อมูลรุ่นในสคริปต์ทุบตีเพื่อให้ทันสมัย

  • คุณไม่ต้องการcurl/ wgetหรือtarติดตั้งpipหรือหรือeasy_install

  • ใช้งานได้กับ 2.7 และ 3.X

บันทึกสิ่งต่อไปนี้เป็น /tmp/initvenv.py :

จากการนำเข้า print_function ในอนาคต

import os, sys, shutil, tempfile, subprocess, tarfile, hashlib

try:
    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

tmp_dir = tempfile.mkdtemp(prefix='initvenv_')
try:
    # read the latest version from PyPI
    f = urlopen("https://pypi.python.org/pypi/virtualenv/")
    # retrieve the .tar.gz file
    tar_found = False
    url = None
    sha256 = None
    for line in f.read().splitlines():
        if isinstance(line, bytes):
            line = line.decode('utf-8')
        if tar_found:
            if 'sha256' in line:
                sha256 = line.split('data-clipboard-text')[1].split('"')[1]
                break
            continue
        if not tar_found and 'tar.gz">' not in line:
            continue
        tar_found = True
        for url in line.split('"'):
            if url.startswith('https'):
                break
    else:
        print('tar.gz not found')
        sys.exit(1)
    file_name = url.rsplit('/', 1)[1]
    print(file_name)
    os.chdir(tmp_dir)
    data = urlopen(url).read()
    data_sha256 = hashlib.sha256(data).hexdigest()
    if sha256 != data_sha256:
        print('sha256 not correct')
        print(sha256)
        print(data_sha256)
        sys.exit(1)
    with open(file_name, 'wb') as fp:
        fp.write(data)
    tar = tarfile.open(file_name)
    tar.extractall()
    tar.close()
    os.chdir(file_name.replace('.tar.gz', ''))
    print(subprocess.check_output([sys.executable, 'virtualenv.py'] +
                                  [sys.argv[1]]).decode('utf-8'), end='')
    if len(sys.argv) > 2:
        print(subprocess.check_output([
            os.path.join(sys.argv[1], 'bin', 'pip'), 'install', 'virtualenv'] +

            sys.argv[2:]).decode('utf-8'), end='')
except:
    raise
finally:
    shutil.rmtree(tmp_dir)  # always clean up

และใช้มันเป็น

python_binary_to_use_in_venv /tmp/initvenv.py your_venv_name [optional packages]

เช่น (ถ้าคุณต้องการdistributeเลเยอร์ความเข้ากันได้จริงๆsetuptools)

python /tmp/initvenv.py venv distribute

โปรดทราบว่าด้วยเวอร์ชันงูหลามที่เก่ากว่านี้อาจทำให้คุณมีInsecurePlatformWarningปัญหา

เมื่อคุณมี virtualenv ของคุณ (ชื่อเช่นvenv) คุณสามารถตั้งค่า virtualenv อื่นโดยใช้virtualenvเพียงแค่ติดตั้ง:

venv/bin/virtualenv venv2

virtualenvwrapper

ฉันขอแนะนำให้ดูvirtualenvwrapperด้วยหลังจากตั้งค่าครั้งเดียว:

% /opt/python/2.7.10/bin/python /tmp/initvenv.py venv virtualenvwrapper

และการเปิดใช้งาน (สามารถทำได้จากสคริปต์การเข้าสู่ระบบของคุณ):

% source venv/bin/virtualenvwrapper.sh

คุณสามารถทำสิ่งต่าง ๆ เช่น:

% mktmpenv 
New python executable in tmp-17bdc3054a46b2b/bin/python
Installing setuptools, pip, wheel...done.
This is a temporary environment. It will be deleted when you run 'deactivate'.
(tmp-17bdc3054a46b2b)% 

¹ ฉันไม่พบวิธีที่จะระงับคำเตือน มันสามารถแก้ไขได้ในpipและ / หรือrequestแต่นักพัฒนาชี้ไปที่กันและกันเป็นสาเหตุ ฉันได้รับคำแนะนำในการอัพเกรดเวอร์ชันหลามที่ฉันใช้เป็นเวอร์ชันล่าสุด ฉันแน่ใจว่าสิ่งนี้จะพังเช่นการติดตั้ง Linux Mint 17 ของฉัน โชคดีที่pipแคชแพ็กเกจดังนั้นคำเตือนจะทำเพียงครั้งเดียวต่อการติดตั้งแพ็กเกจ


คำเตือนInsecurePlatformWarning(เช่นคำเตือนหาก Python เก่ากว่ารุ่น 2.7.9) สามารถแก้ไขได้โดยการติดตั้งแพ็คเกจเพิ่มเติม pyopenssl, pyasn1, ndg-httpsclient จาก PyPI (รองรับ SSL, ถอดรหัสใบรับรอง, https ผ่าน PyOpenSSL) หากไม่มีโปรโตคอลที่ถูกต้องจริง ๆ แล้วมันไม่ปลอดภัยพอที่จะดาวน์โหลดและรันโค้ดใด ๆ
hynekcer

@ hynekcer ฉันจะลองดูนะ ฉันถามตัวเองว่าทำไม pip และ / หรือคำขอไม่ได้ขึ้นอยู่กับแพ็คเกจเหล่านั้นสำหรับไพ ธ อนรุ่นเก่า (เหมาะสม)
Anthon

0

มีคำแนะนำที่ดีในเว็บไซต์ทางการของ Virtualenv https://pypi.python.org/pypi/virtualenv

โดยทั่วไปสิ่งที่ฉันไม่ได้รับการติดตั้งpipที่มีsudo easy_install pipใช้แล้วsudo pip install virtualenvสร้างแล้วสภาพแวดล้อมที่มี: virtualenv my_env(ชื่อมันสิ่งที่คุณต้องการ) ต่อไปนี้ที่ฉันได้: virtualenv --distribute my_env; สิ่งที่ติดตั้งdistributeและpipใน virtualenv ของฉัน

ทำตามคำแนะนำในvirtualenvหน้าอีกครั้ง

ความยุ่งยากมาจาก Ruby; P


0

นี่เป็นวิธีที่ดีในการติดตั้ง virtualenvwrapper (อัปเดตสิ่งนี้ )

ดาวน์โหลดvirtualenv-1.11.4 (คุณสามารถค้นหาล่าสุดได้ที่นี่ ) เปิดเครื่องรูดมันเปิดterminal

# Create a bootstrapenv and activate it:
$ cd ~
$ python <path to unzipped folder>/virtualenv.py bootstrapenv
$ source bootstrapenv/bin/activate

# Install virtualenvwrapper:
$ pip install virtualenvwrapper
$ mkdir -p ~/bootstrapenv/Envs

# append it to file `.bashrc`
$ vi ~/.bashrc
  source ~/bootstrapenv/bin/activate
  export WORKON_HOME=~/bootstrapenv/Envs
  source ~/bootstrapenv/bin/virtualenvwrapper.sh

# run it now.
$ source ~/.bashrc

ว่ามันเป็นตอนนี้คุณสามารถใช้mkvirtualenv env1,lsvirtualenv ..etc

หมายเหตุ: คุณสามารถลบvirtualenv-1.11.4และvirtualenv-1.11.4.zipจากโฟลเดอร์ดาวน์โหลด


0

ข่าวดีคือถ้าคุณติดตั้ง python3.4 แล้ว pyvenv ก็ถูกติดตั้งแล้ว ดังนั้นเพียงแค่

pyvenv project_dir
source project_dir/bin/activate
python --version   
python 3.4.*

ใน env เสมือนนี้คุณสามารถใช้ pip เพื่อติดตั้งโมดูลสำหรับโครงการนี้

ออกจาก env เสมือนนี้เพียง

deactivate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.