2009-11-23 36 views
82

Cấu trúc thư mục nào nên theo sau khi sử dụng virtualenv? Ví dụ, nếu tôi đang xây dựng một ứng dụng WSGI và tạo ra một virtualenv gọi foobar tôi sẽ bắt đầu với một cấu trúc thư mục như:Trường hợp trong một virtualenv nào mã tùy chỉnh đi?

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

Khi môi trường này được tạo ra, nơi người ta sẽ đặt của riêng mình:

  • tệp python?
  • tệp tĩnh (hình ảnh/etc)?
  • gói "tùy chỉnh", chẳng hạn như các gói có sẵn trực tuyến nhưng không tìm thấy trong cửa hàng phô mai?

liên quan đến các thư mục virtualenv?

(Giả sử tôi đã biết where the virtualenv directories themselves should go.)

+6

@jkp: Tôi không đồng ý. Cách bạn bố trí một ứng dụng python là một vấn đề khác với cách bạn định vị ứng dụng đó trong một virtualenv cho các mục đích phát triển. Nó có liên quan, nhưng không giống nhau. Vui lòng không đóng dưới dạng trùng lặp. – jcdyer

Trả lời

62

virtualenv cung cấp một ví dụ python thông dịch viên, không phải là một ví dụ ứng dụng. Thông thường bạn sẽ không tạo các tệp ứng dụng của mình trong các thư mục chứa Python mặc định của hệ thống, do đó không yêu cầu phải định vị ứng dụng của bạn trong thư mục virtualenv.

Ví dụ: bạn có thể có một dự án nơi bạn có nhiều ứng dụng sử dụng cùng virtualenv. Hoặc, bạn có thể thử nghiệm một ứng dụng với virtualenv mà sau này sẽ được triển khai với một hệ thống Python. Hoặc, bạn có thể đóng gói lên một ứng dụng độc lập, trong đó có thể có ý nghĩa để có thư mục virtualenv nằm đâu đó trong thư mục ứng dụng.

Vì vậy, nói chung, tôi không nghĩ có một câu trả lời đúng cho câu hỏi. Và, một điều tốt về virtualenv là nó hỗ trợ nhiều trường hợp sử dụng khác nhau: không cần phải là một cách đúng đắn.

+4

Đồng ý. Tôi sử dụng virtualenv cho tất cả mọi thứ tôi làm, và tôi không bao giờ đặt các tập tin bên trong thư mục virtualenv. Virtualenv cần không có tác động đến cấu trúc dự án của bạn; chỉ cần kích hoạt virtualenv (hoặc sử dụng bin/python) của nó và làm việc trên các tệp của bạn ở bất cứ đâu bạn muốn. –

+0

Tôi cũng đồng ý hết lòng. Lần duy nhất tôi * bao giờ * chạm vào bất kỳ tập tin nào bên trong virtualenv của tôi (tôi sử dụng 'virtualenvwrapper') là khi tôi muốn chỉnh sửa các hook' postactivate' và 'postdeactivate'. –

+0

Câu hỏi sẽ được phục vụ tốt hơn với các ví dụ cụ thể, thực tế về các tùy chọn khác nhau bao gồm cả thương mại như đã thấy trong các câu trả lời khác trong câu hỏi này. – user771555

45

Nếu bạn chỉ có một vài dự án tất cả vì vậy thường, không có gì ngăn bạn từ việc tạo ra một virtualenv mới cho mỗi một, và đưa các gói của bạn ngay bên trong:

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

Ưu điểm của phương pháp này là bạn luôn có thể chắc chắn tìm thấy tập lệnh kích hoạt thuộc về dự án bên trong.

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

Nếu bạn quyết định tổ chức hơn một chút, bạn nên cân nhắc đặt tất cả virtualenv vào một thư mục và đặt tên từng thư mục sau dự án bạn đang làm việc.

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

Bằng cách này bạn luôn có thể bắt đầu lại với ảo mới khi gặp sự cố và tệp dự án của bạn luôn an toàn.

Một ưu điểm khác là một số dự án của bạn có thể sử dụng cùng virtualenv, do đó bạn không phải thực hiện quá trình cài đặt giống nhau nếu bạn có nhiều phụ thuộc.

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

Đối với người dùng thường xuyên phải thiết lập và xé nhỏ virtualenv, bạn nên xem virtualenvwrapper.

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

Với virtualenvwrapper bạn có thể

* create and delete virtual environments 

* organize virtual environments in a central place 

* easily switch between environments 

Bạn không phải lo lắng về nơi virtualenvs của bạn khi làm việc trên các dự án "foo" và "bar":

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

này là cách bạn bắt đầu làm việc trên dự án "foo":

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

Sau đó, chuyển sang dự án "thanh" đơn giản như sau:

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

Khá gọn gàng, phải không?

+0

Tôi * mạnh * đồng ý với câu trả lời này về cách sử dụng 'virtualenvwrapper'. Nó gọn gàng tóm tắt virtualenv đi trong khi vẫn đem lại cho bạn tất cả những lợi ích. –

+2

Nhưng mạnh mẽ * không đồng ý * về EVER đặt mã của bạn bên trong môi trường ảo. Nếu bạn muốn nó "gần" dự án trên hệ thống tập tin, sau đó đặt một thư mục 'venv /' trên cùng cấp với 'BASE_DIR' của dự án. –

2

Nếu bạn cung cấp cho dự án của mình setup.py, pip có thể nhập trực tiếp từ điều khiển phiên bản.

Đỗ một cái gì đó như thế này:

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

Các -e sẽ đưa dự án trong myproject/src, nhưng liên kết nó với myproject/lib/pythonX.X/site-packages/, vì vậy bất kỳ thay đổi bạn thực hiện sẽ được chọn ngay lập tức trong module import nó từ địa phương của bạn site-packages . Các bit #egg cho pip biết tên bạn muốn cung cấp cho gói trứng mà nó tạo ra cho bạn.

Nếu bạn không sử dụng --no-site-packages, hãy cẩn thận để xác định rằng bạn muốn pip để cài đặt vào virtualenv với các tùy chọn -E

21

Vì virtualenv không thể định vị lại, theo ý kiến ​​của tôi là thực hành không tốt để đặt tệp dự án của bạn bên trong thư mục virtualenv. Bản thân virtualenv là một tạo phẩm triển khai/triển khai được tạo ra (giống như một tệp .pyc), không phải là một phần của dự án; bạn nên dễ dàng thổi nó đi và tạo lại nó bất cứ lúc nào, hoặc tạo một cái mới trên một máy chủ triển khai mới, v.v.

Nhiều người trong thực tế sử dụng virtualenvwrapper, loại bỏ các virtualenv thực tế khỏi nhận thức của bạn gần như hoàn toàn, đặt chúng tất cả side-by-side trong $ HOME/.virtualenvs theo mặc định.

Các vấn đề liên quan