2011-06-19 58 views
18

Tôi đã cài đặt các phiên bản python khác nhau trên máy Mac bằng Macports. Khi tôi đã chọn python 2.7 qua $ port select python python27, virtualenvwrapper hoạt động hoàn hảo.Sử dụng các phiên bản python khác nhau với virtualenvwrapper

Nhưng nếu tôi chọn một phiên bản của python, tức là 2.6, virtualenvwrapper tạo ra một thông báo lỗi: ImportError: Không có mô-đun tên virtualenvwrapper.hook_loader

Tôi đã kiểm tra .profile của tôi và nó đang ngồi VIRTUALENVWRAPPER_PYTHON-/opt/local/bin/python, vì vậy nó có vẻ tôi virtualenvwrapper nên làm việc bất kể python mà tôi đã chọn.

Bất kỳ ý tưởng nào sẽ khiến virtualenvwrapper tạo lỗi .hook_loader khi tôi chuyển đổi phiên bản python?

+8

Không đi qua 'cổng chọn ...' và gắn bó với cơ sở 2.7 của bạn, chỉ chạy công việc 'mkvirtualenv --python/path/to/python2.6'? Nó sẽ tự động chuyển sang (và thiết lập môi trường với) trình thông dịch chính xác. Trên hệ thống của tôi (thiết lập với homebrew), 'mkvirtualenv -p python2.6' hoạt động tốt. –

+0

Tôi không nhận được lỗi hook_loader, nhưng nó phàn nàn về việc thiếu DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 Chạy virtualenv với thông dịch viên /opt/local/bin/python2.7 Bạn phải cung cấp DEST_DIR – wmfox3

+1

Rất tiếc, xin lỗi - đã bỏ qua đối số chính! Đó phải là 'mkvirtualenv --python /path/to/python2.6 env_name'. mkvirtualenv tạo một thư mục có tên là "env_name" trong '$ WORKON_HOME' của bạn, được chuyển cho virtualenv làm đối số' DEST_DIR' của nó. Nếu không xác định tên, nó sẽ có một thời gian khó khăn để tìm ra nơi để thiết lập những thứ lên, đó là chắc chắn. –

Trả lời

19

Tôi biết điều này là khá nhiều giải quyết trong bình luận của bạn, nhưng nó mac chỉ,

và thậm chí nhiều hơn tôi nghĩ rằng cách chính xác nên được thiết VIRTUALENVWRAPPER_PYTHON đến python thực bạn đang sử dụng trên dòng lệnh.

Để chắc chắn bạn có thể thực hiện which python.

Trên thực tế, bạn thậm chí có thể làm:

export VIRTUALENVWRAPPER_PYTHON=`which python` 

Trên Linux Tôi làm điều này trong .bashrc của tôi, vì vậy tất cả trong tất cả, giả sử bạn cài đặt virtualenv và tạo ra "môi trường ảo" đầu tiên của bạn virtualenv (cách gốc)

. virtualenv/bin/activate 
export WORKON_HOME=$HOME/.virtualenvs # or whatever else you want 
export VIRTUALENVWRAPPER_PYTHON=`which python` 
export PROJECT_HOME=SOMETHING 
source $HOME/virtualenv/bin/virtualenvwrapper.sh # or wherever else you got that installed 

(và bằng cách này, bạn đã viết:

I checked my .profile and it's setting VIRTUALENVWRAPPER_PYTHON to /opt/local/bin/python, so it seems to me virtualenvwrapper should work regardless of which python I've selected

whi Ch thực sự là đối diện - virtualenv dựa vào việc sử dụng đúng python (và các gói đi với nó) vì vậy nó rất quan trọng để thiết lập đường dẫn python cho phù hợp.

Thậm chí chạy tệp py với "#!/Bin/python" có thể gây ra sự cố khi bạn đã được ảo hóa!

+4

Chạy một vài thử nghiệm trên máy Mac của tôi - nó xuất hiện 'VIRTUALENVWRAPPER_PYTHON' chỉ kiểm soát việc thực thi Python nào được sử dụng bởi chính' virtualenvwrapper', không phải tệp thực thi được cài đặt vào môi trường ảo, ví dụ: khi bạn chạy 'mkproject'. Tôi rất thích bị sai nhưng cho đến nay nó xuất hiện cách duy nhất để chọn một phiên bản Python khác là sử dụng '-p/--python' trong dòng lệnh' virtualenvwrapper'. Nếu đó là sự thật, đó là một loại xấu hổ. –

+0

@ChrisJohnson mmmh kể từ đó tôi ngừng sử dụng virtualenvwrapper - không tìm thấy nhiều nhu cầu cho nó nữa - Tôi không có cách nào dễ dàng để kiểm tra nhanh chóng, nhưng bạn thực sự có thể đúng ... Ngoài ra trên MAC tôi sử dụng brew bây giờ ... – Stefano

+0

là @ChrisJohnson trên ubuntu. đã đặt 'VIRTUALENVWRAPPER_PYTHON' thành python2, nhưng' mkvirtualenv' đã tạo virtualenvs bằng python3. –

-1

Bạn (OP) dường như đã cài đặt virtualenv và virtualenvwrapper với python2.7 và không phải với python2.6. Nếu python2.6 được gọi vào lúc shell của bạn tải kịch bản virtualenvwrapper.sh, nó không vui. Khá đơn giản.

VIRTUALENVWRAPPER_PYTHON được tạo cho những tình huống đó. Với nó, bạn có thể đảm bảo bạn luôn sử dụng đúng phiên bản của python và không phải luôn thêm rằng -p /path/to/python2.7

Vì vậy, tôi không đồng ý với câu trả lời của Stefano trong trường hợp đó, trong tình huống của OP, bạn nên đã giải thích rõ ràng trong .bashrc của bạn mà python để sử dụng:

... 
export VIRTUALENVWRAPPER_PYTHON=/path/to/your/python2.7 
source /path/to/bin/virtualenvwrapper.sh 

Giống như nó nên được ok tất cả các thời gian! Virtualenvwrapper được thực hiện để đơn giản hóa mọi thứ.

Ngoài ra, xin lưu ý rằng /opt/local/bin/python phải là một liên kết tượng trưng đến phiên bản python bạn chọn với port python select (hãy kiểm tra xem có ls -l /opt/local/bin/python để chắc chắn) không.

+2

Tôi muốn nhấn mạnh rằng việc sử dụng cờ -p là một giải pháp nếu bạn có các thiết bị đầu cuối lớp ngăn bạn thiết lập một biến môi trường (như tôi có). mkvirtualenv -p/usr/bin/python3 Foo – htmldrum

5

Xác nhận việc sử dụng hai biến môi trường tương tự tên:

VIRTUALENVWRAPPER_PYTHON - mà Python phiên bản được sử dụng bởi các tiện ích virtualenvwrapper riêng của mình.

VIRTUALENV_PYTHON - phiên bản Python nào sẽ được cài đặt bởi virtualenv khi bạn tạo môi trường ảo mới. Tương đương với tùy chọn -p/--python trên dòng lệnh virtualenv.

Và có lẽ dĩ nhiên :) phiên bản Python chạy trong môi trường ảo là phiên bản bạn đã cài đặt - không liên quan đến các biến môi trường ở trên sau khi ENV được tạo.

Xem https://stackoverflow.com/a/24724360/763269 để biết cách nâng cấp Python trong virtualenv.

6

Không có cách nào trong số này hoạt động. Tôi đã cài đặt Python3 trước khi thiết lập máy osx, và pip và tất cả mặc định cho nó.

Thứ nhất, kiểm tra mà bạn đã cài đặt python:

$ `which python` -V 

Nếu đây trả về "Python 2.7.12", sau đó bạn được thiết lập để chạy:

$ mkvirtualenv -p `which python` api_server 
Running virtualenv with interpreter /usr/local/bin/python 
New python executable in /Users/eric/.virtualenvs/api_server/bin/python2.7 
Also creating executable in /Users/eric/.virtualenvs/api_server/bin/python 
Installing setuptools, pip, wheel...done. 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/predeactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postdeactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/preactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/get_env_details 

này cũng sẽ kích hoạt api_server workon, thay đổi python của bạn có thể thực thi:

$ which python 
/Users/eric/.virtualenvs/api_server/bin/python 
$ python -V 
Python 2.7.12 

which python thực sự làm gì? Nó ra các thư mục của các tập tin thực thi python tìm thấy trong PATH của bạn:

$ which python 
/usr/local/bin/python 

Bằng cách sử dụng which python, cơ bản bạn đang đi qua trong /usr/local/bin/python đến -p tùy chọn trong thư mục mkvirtualenv.

Điều gì sẽ xảy ra khi bạn có nhiều hơn một tệp thực thi python được trả lại trong which python? Chỉ cần tìm cái bạn muốn và chuyển nó vào:

$ mkvirtualenv -p /usr/local/bin/python3 api_server 

Và virtualenvwrapper sẽ kết thúc bằng cách sử dụng con trăn đó để thực thi.

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