ความสัมพันธ์ระหว่าง virtualenv และ pyenv คืออะไร?


175

ฉันเพิ่งเรียนรู้วิธีการใช้ virtualenv และ virtualenvwrapper ในเวิร์กโฟลว์ของฉัน แต่ฉันเห็น pyenv กล่าวถึงในคู่มือเล็กน้อย แต่ดูเหมือนว่าฉันจะไม่เข้าใจความหมายของ pyenv และคล้ายกับ virtualenv อย่างไร pyenv เป็นการทดแทนที่ดีขึ้น / ใหม่กว่าสำหรับ virtualenv หรือเครื่องมือฟรีหรือไม่? หากหลังมันทำอะไรที่แตกต่างกันและสอง (และ virtualenvwrapper ถ้ามี) ทำงานร่วมกันได้อย่างไร?


3
fgimian.github.io/blog/2014/04/20/... : แต่มีเป็นอีกหนึ่งทางเลือกที่เรียกว่า pyenv ซึ่งมีข้อดีที่สำคัญหลาย
Martijn Pieters

11
อย่าเป็นเหมือนฉันและpyenvสับสนกับpyvenv
ผู้ใช้

คำตอบ:


162

Pyenvและvirtualenvเป็นเครื่องมือที่แตกต่างกันมากที่ทำงานในวิธีต่าง ๆ ในการทำสิ่งต่าง ๆ :

  • Pyenvเป็นส่วนขยาย bash - จะไม่ทำงานบน Windows - ที่ขัดขวางสายของคุณไปยัง python, pip, และอื่น ๆ เพื่อนำพวกเขาไปยังหนึ่งในหลาย ๆ เครื่องมือของ python ดังนั้นคุณจะมีไลบรารี่ทั้งหมดที่คุณติดตั้งในเวอร์ชันไพ ธ อนที่เลือกไว้ให้พร้อม - มันเป็นสิ่งที่ดีสำหรับผู้ใช้ที่ต้องสลับไปมาระหว่างไพ ธ อนรุ่นต่าง ๆ

  • VirtualEnvเป็น pure python ดังนั้นทำงานได้ทุกที่มันทำสำเนาเป็นทางเลือกเฉพาะของ python และ pip ​​local กับสภาพแวดล้อมที่เปิดใช้งานซึ่งอาจมีหรือไม่มีลิงก์ไปยังโซ่เครื่องมือระบบในปัจจุบันหากคุณไม่สามารถทำได้ ติดตั้งไลบรารีย่อยที่รู้จักในสภาพแวดล้อมนั้น ดังนั้นจึงเป็นการดีกว่าสำหรับการทดสอบและการปรับใช้ตามที่คุณทราบแน่นอนว่าไลบรารีใดที่ใช้เวอร์ชันใดและการเปลี่ยนแปลงระดับโลกจะไม่ส่งผลกระทบต่อโมดูลของคุณ

venv python> 3.3

โปรดทราบว่าจาก Python 3.3 เป็นต้นไปมีการติดตั้ง VirtualEnv ในตัวซึ่งเรียกว่า venv (ในบางครั้งการติดตั้ง wrapper เรียกว่า pyvenv - wrapper นี้เลิกใช้ใน Python 3.6 ) ซึ่งควรใช้ในการตั้งค่า เพื่อหลีกเลี่ยงปัญหาที่เป็นไปได้กับเสื้อคลุมก็มักจะเป็นความคิดที่ดีที่จะใช้มันได้โดยตรงโดยใช้/path/to/python3 -m venv desired/env/pathหรือคุณสามารถใช้ดีpyเลือกหลามบน Windows py -3 -m venv desired/env/pathด้วย มันจะสร้างไดเรกทอรีที่ระบุด้วยdesired/env/pathการกำหนดค่าและเติมให้เหมาะสม โดยทั่วไปแล้วมันเหมือนใช้ VirtualEnv มาก

เครื่องมือเพิ่มเติม

มีเครื่องมือหลายอย่างที่ควรค่าแก่การกล่าวขวัญและพิจารณาเนื่องจากสามารถช่วยในการใช้งานอย่างน้อยหนึ่งอย่างข้างต้น:

  • VirtualEnvWrapperจัดการและทำให้การใช้งานและการจัดการของ VirtualEnv - Cross Platformง่ายขึ้น
  • pyenv-virtualenv , ติดตั้งโดยpyenv-ติดตั้งซึ่งจะช่วยให้เครื่องมือ PyEnv สำหรับการจัดการและการเชื่อมต่อไปยัง virtualenv - กับเรื่องนี้คุณสามารถมีการติดตั้งฐานที่มีมากกว่าหนึ่งรุ่นของงูหลามและสร้างสภาพแวดล้อมที่แยกได้ในแต่ละของพวกเขา - ลินุกซ์ / OS- X แนะนำโดย Johann Visagie
  • PyInstallerสามารถนำโค้ดไพ ธ อนของคุณไปพัฒนาและทดสอบภายใต้ VirtualEnv และรวมมันเพื่อให้สามารถรันหนึ่งแพลตฟอร์มที่ไม่มีเวอร์ชันของไพ ธ อนที่ติดตั้งไว้ - โปรดทราบว่ามันไม่ใช่คอมไพเลอร์ไขว้คุณต้องใช้ Windows (เสมือน -) เครื่องที่ใช้ในการสร้างการติดตั้ง Windows ฯลฯ แต่ก็มีประโยชน์แม้ในที่ที่คุณมั่นใจได้ว่าจะมีการติดตั้ง python แต่ไม่สามารถมั่นใจได้ว่าเวอร์ชั่นของ python และไลบรารีทั้งหมดจะเข้ากันได้กับรหัสของคุณ

3
มันอาจคุ้มค่าที่จะกล่าวถึง pyenv-virtualenv ซึ่งเป็นปลั๊กอิน pyenv ที่อนุญาตให้ pyenv และ virtualenv ทำงานได้อย่างราบรื่นในเวลาเดียวกัน หากคุณติดตั้ง pyenv โดยใช้ pyenv-installer แล้ว pyenv-virtualenv จะปรากฏขึ้น * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv

1
สิ่งที่เกี่ยวกับvenvขณะนี้อยู่ในห้องสมุดมาตรฐาน?
Flimm

@Flimm: จาก python 3.3 เป็นต้นไป venv เป็นส่วนหนึ่งของไลบรารี่มาตรฐานและควรใช้แทน virtualenv เพราะมันมักจะอธิบายว่า "virtualenv ทำถูกต้อง" - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Steve Barnes

2
pyenv-virtualenv ไม่ได้ (หรืออย่างน้อยก็ไม่มี) linux เท่านั้น มีแพ็คเกจ homebrew สำหรับติดตั้งง่ายบน MacOS
เปิด

ขอบคุณสำหรับการเน้นการทำงานร่วมกัน!
HashRocketSyntax

16

virtualenvช่วยให้คุณสร้างการติดตั้ง Python ที่กำหนดเองเช่นในไดเรกทอรีย่อยของโครงการของคุณ แต่ละโครงการของคุณสามารถมีของตัวเองpython(หรือหลาย ๆ โครงการ) ภายใต้ virtualenv ที่เกี่ยวข้อง มันเป็นสิ่งที่ดีอย่างสมบูรณ์แบบสำหรับ virtualenv บางคน / ทุกคนที่มีแม้กระทั่งรุ่นเดียวกันpython(เช่น 2.7.16) โดยไม่มีข้อขัดแย้ง - พวกมันอยู่แยกกันและไม่รู้ซึ่งกันและกัน หากคุณต้องการใช้สิ่งเหล่าpythonนี้คุณต้องดำเนินการactivate(โดยเรียกใช้สคริปต์ซึ่งจะแก้ไขของคุณชั่วคราวPATHเพื่อให้แน่ใจว่าbin/ไดเรกทอรีของ virtualenv มาก่อน) จากจุดนั้นการโทรpython(หรือpipอื่น ๆ ) จะเรียกใช้เวอร์ชัน virtualenv นั้นจนกว่าคุณdeactivateจะ (เรียกคืนPATH)

pyenvทำงานในระดับที่กว้างกว่าvirtualenv- มันมีการลงทะเบียนการติดตั้ง Python (และสามารถใช้ในการติดตั้งใหม่) และช่วยให้คุณสามารถกำหนดเวอร์ชันของ Python ที่จะทำงานเมื่อคุณใช้pythonคำสั่ง ฟังดูคล้ายกัน แต่การใช้งานจริงแตกต่างกันเล็กน้อย มันทำงานได้โดยการเพิ่มpythonสคริปต์shim ให้กับคุณPATH(อย่างถาวร) แล้วตัดสินใจว่าpythonจะเรียกใช้"ของจริง" แบบใด คุณยังสามารถกำหนดค่า pyenv เพื่อโทรหาหนึ่งใน virtualenv pythons ของคุณ (โดยใช้pyenv-virtualenvปลั๊กอิน) Python เวอร์ชันที่คุณติดตั้งโดยใช้pyenvเข้าไปใน$(pyenv root)/versions/ไดเรกทอรี (โดยค่าเริ่มต้น pyenv root คือ ~ / .pyenv) ดังนั้นจะมี 'global' มากกว่า virtualenv ตามปกติแล้วคุณไม่สามารถติดตั้ง Python เวอร์ชั่นซ้ำ ๆ กันได้pyenvอย่างน้อยการทำเช่นนั้นไม่ใช่แนวคิดหลัก

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

ในระยะสั้น:

  • virtualenv อนุญาตให้คุณสร้างการติดตั้งไพ ธ อนแบบโลคัลโดยการโคลนจากสิ่งที่มีอยู่
  • pyenv อนุญาตให้คุณติดตั้งงูหลามรุ่นต่าง ๆ พร้อมกัน (ทั้งระบบหรือเฉพาะผู้ใช้ในพื้นที่) จากนั้นเลือกไพ ธ อนจำนวนมากที่จะเรียกใช้ในเวลาใดก็ตาม (รวมถึงที่สร้างโดย virtualenv หรือ Anaconda)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.