2015-04-17 13 views
6

Điều này không gây ra cho tôi bất kỳ sự cố nào mà tôi không thể giải quyết bằng cách kích hoạt môi trường ảo và chạy pip install -U pip, nhưng tôi luôn tự hỏi phiên bản cũ của pip đến từ đâu.Tại sao 'python3 -m venv myenv' cài đặt phiên bản pip cũ hơn vào myenv so với bất kỳ phiên bản pip nào tôi có thể tìm thấy ở bất kỳ đâu trên hệ thống?

Tôi đang sử dụng OS X 10.7.5. Khi tôi tạo một môi trường ảo bằng cách sử dụng pyvenv-3.4 myenv hoặc python3 -m venv myenv, phiên bản của pip được cài đặt bên trong môi trường ảo là 6.0.8, nhưng tôi đã nâng cấp pip toàn cục của mình lên 6.1.1.

Đây là một phiên terminal chứng minh những gì tôi có nghĩa là:

$ python3 -m venv myenv 
$ myenv/bin/pip -V 
pip 6.0.8 from /Users/dust/Desktop/myenv/lib/python3.4/site-packages (python 3.4) 

Dưới đây là những gì tôi muốn xảy ra:

$ source myenv/bin/activate 
(myenv)$ pip -V 
UPDATED SYSTEM VERSION HERE WOULD BE NICE 

tôi không thể tìm thấy một pip 6.0.8 bất cứ nơi nào khác, khác với những gì được tạo bên trong môi trường ảo.

Sau đây là các kết quả đầu ra của các lệnh khác nhau mà tôi có sử dụng để thử và con số này ra:

$ which pip 
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip 

$ which pip3 
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip3 

$ pip -V 
pip 6.1.1 from /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages (python 3.4) 

$ pip3 -V 
pip 6.1.1 from /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages (python 3.4) 

Tôi thậm chí đã cố gắng sử dụng find:

$ find/-type f -name pip 2>&1 | awk '! /^f.*$/' 
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip 
/usr/local/bin/pip 

$ find/-type f -name pip3 2>&1 | awk '! /^f.*$/' 
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip3 

Tôi nghĩ có lẽ rằng /usr/local/bin/pip có thể có là thủ phạm, nhưng không:

$ /usr/local/bin/pip -V 
pip 6.1.1 from /Library/Python/2.7/site-packages/pip-6.1.1-py2.7.egg (python 2.7) 

Hmm. Có lẽ hệ điều hành X python có nó?

$ /usr/bin/python 
>>> import pip 
>>> pip.__version__ 
'6.1.1' 

6.1.1 được báo cáo không có vấn đề phân phối của python Tôi hỏi, cho dù đó là OS X 2.7.1, python.org của 2.7.9, hoặc python.org của 3.4.3.

Có thể (hoặc khuyến khích) cập nhật phiên bản pip được đưa vào môi trường ảo không?

Trả lời

3

Tôi gặp phải sự cố tương tự, chạy OSX 10.10.2python 3.4.2. Gần đây nhất, tôi đã tạo một môi trường ảo trên máy debian wheezy với python 3.4.3 và cũng đã kết thúc bằng phiên bản cũ hơn của pip so với hiện có. phải nâng cấp pip.

Tôi đã nâng cấp pip trong môi trường ảo để 6.1.1 từ 6.0.8 bằng tay, bởi vì tôi là o.c.d về các phiên bản thư viện phần mềm theo cách đó - và vâng, tôi đang nâng cấp phiên bản python 3 tôi để 3.4.3 ngay bây giờ. Dù sao, hệ thống của tôi python3-pip là phiên bản mới nhất 6.1.1, vì vậy tôi cũng tự hỏi tại sao pyvenv tạo một môi trường ảo mới và tải nó với cũ pip.

Tôi chưa nhận thấy bất kỳ điều gì xấu xảy ra trong bất kỳ môi trường ảo nào do nâng cấp pip, (nhưng mặt khác, tôi cũng không nhận thấy điều gì tốt) Rõ ràng là pip mới nhanh hơn - không thông báo, và đầu ra ít rác trên cài đặt thành công vì người dùng không quan tâm - cũng không nhận thấy, có lẽ vì tôi là một trong những người không quan tâm, và cũng đi kèm với một máy pha cà phê hiện đại có khả năng pha cà phê nghệ thuật để khởi động !!!- vẫn đang đợi sudo pip install latte để hoàn thành: (

Vì vậy, để trả lời câu hỏi của bạn, điều này chắc chắn có thể và có thể nên nâng cấp, vì rõ ràng là sửa lỗi mới và nhanh hơn, nhưng tôi đoán tốc độ tăng lên không phải là lớn, và sửa lỗi không ảnh hưởng đến tất cả những người đó (tôi chưa bao giờ phải đối mặt với một lỗi với việc sử dụng của tôi cũ pip). cờ --system-site-packages khi bạn tạo môi trường ảo mới, như thế này

pyvenv myenv --system-site-packages 

này sẽ liên kết đến hệ thống của bạn phiên bản rộng của pip, và sẽ loại bỏ không ít phiền toái mà là tự nâng cấp pip trên tất cả các môi trường ảo, nhưng nếu bạn làm điều này, sau đó là môi trường ảo của bạn tất cả những gì ảo?

cập nhật: theo sau rant của tôi ở trên, tôi đã đi vào nguồn gói của venv để đào. pip được thành lập bởi một phương pháp gọi là _setup_pip trong file __init__.py, dòng 248

def _setup_pip(self, context): 
     """Installs or upgrades pip in a virtual environment""" 
     # We run ensurepip in isolated mode to avoid side effects from 
     # environment vars, the current directory and anything else 
     # intended for the global Python environment 
     cmd = [context.env_exe, '-Im', 'ensurepip', '--upgrade', 
                '--default-pip'] 
     subprocess.check_output(cmd, stderr=subprocess.STDOUT) 

Vì vậy, venv dường như được gọi ensurepip từ vỏ bằng cách sử dụng mô-đun subprocess.

Một phút nữa của google-fu đã cho tôi điều này từ số documentation for ensurepip.

ensurepip.version()

Trả về một chuỗi xác định phiên bản đóng gói của pip sẽ được cài đặt khi bootstrapping một môi trường.

Vì vậy, từ dòng lệnh, đoạn code sau:

$ python3 -c 'import ensurepip; print(ensurepip.version())' 
6.0.8 

màn hình của tôi hiện tại pip sẽ được bootstrapped với ensurepip.

Tôi đoán chúng tôi bị mắc kẹt với các phiên bản cũ của pip cho mỗi cài đặt mới cho đến khi ensurepip được nâng cấp, như tôi không thể tìm thấy một cách để nâng cấp phiên bản của pip mà đi kèm với ensurepip

+0

Oh! Tôi quên mất 'ensurepip''! Sau khi tôi đọc tài liệu ensurepip mà bạn đã tham chiếu, nơi tôi được gửi đến PEP-453 để biết thêm thông tin, [phần này trong PEP 453] (https://www.python.org/dev/peps/pep-0453/#updating- the-private-copy-of-pip) đã cho tôi một số hiểu biết rằng có những lý do cho hành vi, vì vậy tôi không còn sợ rằng tôi đã cài đặt python bị hỏng. – dusty

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