2011-12-08 38 views
42

Tôi đã kiểm tra kích hoạt kịch bản và có vẻ với tôi tất cả nó là:Virtualenv hoạt động như thế nào?

  • bộ VIRTUAL_ENV env
  • thêm $ VIRTUAL_ENV/bin trước PATH

như thế nào virtualenv cung cấp môi trường ảo huyền ảo này? Tôi nhớ gì?

+3

Don Đừng quên [virtualenv burrito] (https: // github.com/brainsik/virtualenv-burrito) –

Trả lời

35

Tôi sẽ mô tả quy trình cơ bản, mà tôi đã học được từ bản trình bày mà jcollado liên kết đến.

Khi Python bắt đầu, nó nhìn vào đường dẫn nhị phân và tiền tố của nó. Giả sử virtualenv của bạn là /home/blah/scratch. Sau đó, nhị phân python (mà chỉ là một bản sao của hệ nhị phân python của bạn) sẽ có trong /home/blah/scratch/bin/python. Python tìm kiếm lib/pythonX.X/os.py trong /home/blah/scratch/bin/, sau đó /home/blah/scratch/ và dừng ở đó vì tồn tại /home/blah/scratch/lib/pythonX.X/os.py. Nếu không, Python sẽ tiếp tục tìm kiếm /home/blah/lib/pythonX.X/os.py, vv Sau đó đặt sys.prefix dựa trên điều này. Nó sử dụng một quá trình tương tự để thiết lập sys.exec_prefix, và sau đó sys.path được xây dựng dựa trên những điều này.

+1

'X.X' có nguồn gốc từ phiên bản Python, vì vậy nó sẽ là' 2.7' hoặc một cái gì đó tương tự. – Max

+0

Không bao giờ nghĩ về con đường này phát hiện ra cho sys.prefix! – Drake

+0

Cảm ơn bạn đã giải thích rõ ràng trong phần nội dung câu trả lời của bạn thay vì liên kết với một nguồn bên ngoài có thể thay đổi hoặc biến mất trong tương lai. –

23

Đây là một nội dung rất tốt presentation về chủ đề này. Về cơ bản, nó giải thích các bước để viết của riêng bạn virtualenv với các thủ thuật tương tự Ian Bicking được sử dụng để viết nó.

+1

* "Rất tiếc, chương trình này đã bị xóa khỏi Blip." * → Đây có phải là ULR mới cho video không? http://pyvideo.org/video/389/pycon-2011--reverse-engineering-ian-bicking--39-s –

+0

@ DenilsonSá: Tôi không phải là jcollado nhưng theo như tôi nhớ, vâng. – Max

+0

@ DenilsonSá Xin lỗi vì sự chậm trễ. Vâng, đó là video. Tôi đã cập nhật liên kết trong phản hồi. Cảm ơn. – jcollado

8
  1. Đầu tiên, người dùng tạo virtualenv mới bằng lệnh virtualenv myenv. Việc này tạo một thư mục có tên là myenv và sao chép hệ nhị phân python thành myenv/bin. Nó cũng thêm các tệp và thư mục cần thiết khác vào myenv, bao gồm tập lệnh thiết lập trong bin/kích hoạtlib thư mục con cho các mô-đun và gói.
  2. Sau đó, người dùng kích hoạt tập lệnh kích hoạt với . myenv/bin/activate, đặt biến môi trường PATH của vỏ để bắt đầu với myenv/bin.
  3. Bây giờ khi người dùng chạy python từ trình bao này, nó sẽ thực thi bản sao của tệp nhị phân được lưu trữ trong myenv/bin. Mặc dù nhị phân giống hệt nhị phân trong/usr/bin/python, nhị phân python chuẩn được thiết kế để tìm kiếm các gói và mô-đun trong các thư mục có liên quan đến đường dẫn của nhị phân (chức năng này không liên quan đến virtualenv). Nó trông trong ../lib/pythonX.Y trong đó X và Y là số phiên bản chính và nhỏ của nhị phân python. Vì vậy, bây giờ nó đang tìm kiếm trong myenv/lib/pythonX.Y.
  4. Các myenv/bin thư mục cũng chứa một kịch bản có tên pip để khi người dùng cài đặt các gói mới sử dụng pip từ virtualenv, họ sẽ được cài đặt trong myenv/lib/pythonX.Y
+0

Tôi tự hỏi các bạn biết đường dẫn bí mật ở đâu đó như '../ lib/pythonX.Y' và thậm chí cả những thứ khác liên quan đến' sys.prefix' và v.v. – Drake

+1

Tôi chưa thấy bất kỳ tài liệu nào tốt về nó, nhưng tôi nhận thấy hành vi này khi xây dựng Python từ nguồn. Bạn cũng có thể kiểm tra nó như sau: 'mkdir/tmp/bin; mkdir/tmp/lib; cp/usr/bin/python/tmp/bin; cp -r /usr/lib/pythonX.Y/ /tmp/lib/pythonX.Y;/tmp/bin/python'. Sau đó gõ 'import sys; sys.prefix'. Điều này sẽ hiển thị "/ tmp". Nếu bạn loại bỏ thư mục/tmp/lib, nó sẽ trở lại "/ usr". – clark800

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