โค้ดที่กำหนดเองไปอยู่ที่ไหนใน Virtualenv


107

สิ่งที่จัดเรียงโครงสร้างไดเรกทอรีหนึ่งควรทำตามเมื่อใช้virtualenv? ตัวอย่างเช่นถ้าฉันกำลังสร้างแอปพลิเคชัน WSGI และสร้าง Virtualenv ที่เรียกว่าfoobarฉันจะเริ่มต้นด้วยโครงสร้างไดเร็กทอรีเช่น:

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}

เมื่อสร้างสภาพแวดล้อมนี้แล้วสถานที่หนึ่งจะเป็นของตนเอง:

  • ไฟล์ python?
  • ไฟล์คงที่ (ภาพ / ฯลฯ )?
  • แพ็คเกจ "กำหนดเอง" เช่นที่มีอยู่ทั่วไป แต่ไม่พบในร้านขายชีส?

เกี่ยวข้องกับvirtualenvไดเรกทอรี?

(สมมติว่าฉันรู้แล้วว่าไดเรกทอรี Virtualenv ควรไปที่ใด)


8
@jkp: ฉันไม่เห็นด้วย วิธีที่คุณจัดวางแอปพลิเคชัน python นั้นแตกต่างจากวิธีที่คุณค้นหาแอปพลิเคชันนั้นภายใน Virtualenv เพื่อวัตถุประสงค์ในการพัฒนา มันเกี่ยวข้องกัน แต่ไม่เหมือนกัน กรุณาอย่าปิดว่าซ้ำกัน
jcdyer

คำตอบ:


90

virtualenvจัดเตรียมอินสแตนซ์ล่าม python ไม่ใช่อินสแตนซ์ของแอปพลิเคชัน โดยปกติคุณจะไม่สร้างไฟล์แอปพลิเคชันของคุณภายในไดเร็กทอรีที่มี Python เริ่มต้นของระบบเช่นเดียวกันคุณไม่จำเป็นต้องค้นหาแอปพลิเคชันของคุณภายในไดเร็กทอรี Virtualenv

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

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


8
เห็นด้วย ฉันใช้ Virtualenv สำหรับทุกสิ่งที่ฉันทำและฉันไม่เคยวางไฟล์ไว้ในไดเร็กทอรี Virtualenv ความต้องการ Virtualenv ไม่มีผลกระทบต่อโครงสร้างโครงการของคุณ เพียงแค่เปิดใช้งาน Virtualenv (หรือใช้ bin / python) และทำงานกับไฟล์ของคุณทุกที่ที่คุณมี
Carl Meyer

ฉันยังเห็นด้วยบริสุทธิ์ใจ ครั้งเดียวที่ฉันเคยสัมผัสไฟล์ใด ๆ ใน Virtualenv ของฉัน (ฉันใช้virtualenvwrapper) คือเมื่อฉันต้องการแก้ไขpostactivateand postdeactivatehooks
Thane Brimhall

คำถามจะได้รับการตอบสนองที่ดีกว่าด้วยตัวอย่างที่เป็นรูปธรรมและใช้งานได้จริงของตัวเลือกต่างๆรวมถึงการแลกเปลี่ยนที่เห็นในคำตอบอื่น ๆ ในคำถามนี้
andyfeller

2
เป็นการดีกว่าที่จะแยกโครงการของคุณไปยังvirtualenvไดเรกทอรี แต่การเปรียบเทียบvirtualenvกับ python ของระบบนั้นไม่เป็นประโยชน์เนื่องจากมีจุดประสงค์virtualenvเพื่อแก้ไขการอ้างอิงที่เสียและแยกโครงการเพื่อให้สามารถใช้เวอร์ชันแพ็คเกจที่แตกต่างกันและแม้แต่เวอร์ชัน python (ฉันรู้ว่าสิ่งนี้ถูกเขียนไว้ล่วงหน้า -python3) การอนุญาตให้แอปแชร์ a virtualenvใช้งานvirtualenvราวกับว่าเป็นงูหลามของระบบทำให้แอปมีความเสี่ยงต่อปัญหาเดียวกัน Virtualenv ได้รับการออกแบบมาเพื่อแก้ไข There should be one obvious way to do it; ตามเหตุผลที่ควรจะเป็น 1: 1
ดาวอส

@Ned: พยายามหาแนวทางปฏิบัติที่ดีที่สุด แต่ก็ยังไม่ชัดเจน: ถ้าคุณมีหลายสิบโปรเจ็กต์แต่ละโปรเจ็กต์มีความสามารถของตัวเองคุณจะติดตามได้อย่างไรว่าโปรเจ็กต์ใดถูกใช้กับอัลตร้าใด เพิ่มเชลล์สคริปต์เล็ก ๆ ในรูทของแต่ละโฟลเดอร์ด้วยชื่อของ Virtualenv ที่คุณใช้ด้วย?
ccpizza

57

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

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py

ข้อดีของแนวทางนี้คือคุณสามารถค้นหาสคริปต์เปิดใช้งานที่เป็นของโครงการได้ตลอดเวลา

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>

หากคุณตัดสินใจที่จะจัดระเบียบให้มากขึ้นคุณควรพิจารณาใส่คุณธรรมทั้งหมดของคุณไว้ในโฟลเดอร์เดียวและตั้งชื่อแต่ละรายการตามโครงการที่คุณกำลังดำเนินการอยู่

  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py

ด้วยวิธีนี้คุณสามารถเริ่มต้นใหม่ด้วย Virtualenv ใหม่เมื่อมีสิ่งผิดปกติเกิดขึ้นและไฟล์โครงการของคุณจะปลอดภัย

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

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>

สำหรับผู้ใช้ที่ต้องตั้งค่าและฉีกขาดคุณธรรมเป็นประจำควรดูที่ Virtualenvwrapper

http://pypi.python.org/pypi/virtualenvwrapper

ด้วย Virtualenvwrapper คุณสามารถ

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

คุณไม่ต้องกังวลอีกต่อไปว่าคนเก่งของคุณอยู่ที่ไหนเมื่อทำงานในโครงการ "foo" และ "bar":

  /foo
    /mypackage1
      __init__.py
  /bar
    /mypackage2
      __init__.py

นี่คือวิธีที่คุณเริ่มทำงานในโครงการ "foo":

$ cd foo
$ workon
bar
foo
$ workon foo
(foo)$ python
>>> import mypackage1
>>>

จากนั้นเปลี่ยนไปใช้ "bar" ของโปรเจ็กต์ก็ทำได้ง่ายๆดังนี้:

$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>

สวยเนี๊ยบใช่มั้ย?


ผมขอvirtualenvwrapperเห็นด้วยกับคำตอบนี้เกี่ยวกับการใช้ มันแยกความเป็นนามธรรมออกไปอย่างเรียบร้อยในขณะที่ยังคงให้ประโยชน์ทั้งหมดแก่คุณ
Thane Brimhall

5
แต่ไม่เห็นด้วยอย่างยิ่งเกี่ยวกับ EVER ที่ใส่รหัสของคุณในสภาพแวดล้อมเสมือนจริง หากคุณต้องการให้ "ใกล้" โปรเจ็กต์บนระบบไฟล์ให้วางvenv/ไดเร็กทอรีไว้ในระดับเดียวกับโปรเจ็กBASE_DIRต์
Rob Grant

30

เนื่องจาก Virtualenvs ไม่สามารถย้ายตำแหน่งได้ในความคิดของฉันการวางไฟล์โปรเจ็กต์ของคุณในไดเร็กทอรี Virtualenv นั้นเป็นวิธีที่ไม่ดี Virtualenv เองเป็นสิ่งประดิษฐ์สำหรับการพัฒนา / การปรับใช้ที่สร้างขึ้น (ประเภทของไฟล์. pyc) ไม่ใช่ส่วนหนึ่งของโครงการ มันควรจะง่ายที่จะระเบิดมันออกไปและสร้างมันขึ้นมาใหม่ได้ตลอดเวลาหรือสร้างใหม่บนโฮสต์การปรับใช้ใหม่เป็นต้น

ในความเป็นจริงหลายคนใช้Virtualenvwrapperซึ่งจะลบ Virtualenvs ที่แท้จริงออกจากการรับรู้ของคุณเกือบทั้งหมดโดยวางไว้เคียงข้างกันใน $ HOME / .virtualenvs ตามค่าเริ่มต้น


เห็นด้วยอย่างยิ่งว่าเป็นการปฏิบัติที่ไม่ดีซึ่งเป็นการดีที่จะชี้ให้เห็นว่ามันควรจะง่ายต่อการระเบิดและสร้างขึ้นใหม่โดยเฉพาะอย่างยิ่งสำหรับการทดสอบการใช้งานและการกำจัดแพ็คเกจความต้องการที่ไม่จำเป็นออกไป เพียงแค่ต้องการเพิ่มว่า Virtualenv สามารถย้ายตำแหน่งได้โดยใช้เช่นvirtualenv --relocatable myvenvดูstackoverflow.com/a/6628642/1335793เพียงเพราะคุณไม่ได้หมายความว่าคุณควรจะทำ
ดาวอส

2

หากคุณให้โครงการของคุณsetup.pypip สามารถนำเข้าจากการควบคุมเวอร์ชันได้โดยตรง

ทำสิ่งนี้:

$ virtualenv --no-site-packages myproject
$ . myproject/bin/activate
$ easy_install pip
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj

-eจะทำให้โครงการในmyproject/srcแต่เชื่อมโยงกับmyproject/lib/pythonX.X/site-packages/ดังนั้นการเปลี่ยนแปลงใด ๆ site-packagesที่คุณทำจะได้รับเลือกขึ้นทันทีในโมดูลที่นำเข้าจากประเทศของคุณ #eggบิตบอก pip ชื่ออะไรคุณต้องการให้แพคเกจไข่มันจะสร้างสำหรับคุณ

หากคุณไม่ได้ใช้--no-site-packagesโปรดระบุอย่างระมัดระวังว่าคุณต้องการให้ pip ติดตั้งลงใน Virtualenv ด้วย-Eตัวเลือก

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