Cách thích hợp để quản lý nhiều phiên bản python là gì?


21

Tôi có một máy với Python 2.6 được cài đặt làm Python mặc định. Sau đó, tôi đã cài đặt Python 2.7 và tạo / usr / bin / python theo cách thủ công như một liên kết tượng trưng cho bản cài đặt mới.

Sau đó, tôi gặp vấn đề với lệnh không tìm thấy . Tôi đang cố gắng cài đặt lại nó:

sudo apt-get remove command-not-found

và tôi nhận được lỗi này:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Nhưng tôi thực sự muốn Python 2.7 là mặc định. Làm thế nào để tôi sửa chữa mớ hỗn độn này?

Câu trả lời:


16

Thay đổi Python mặc định (hoặc Perl, vv) trên một hệ điều hành là thực sự ý tưởng tồi. Trình thông dịch này thực sự là một phần của HĐH và có thể có các thành phần HĐH khác được viết riêng để hoạt động với phiên bản của trình thông dịch đó.

Ví dụ trên Redhat công cụ yum thực hiện cập nhật phần mềm hệ thống là một ứng dụng python. Bạn thực sự không muốn phá vỡ điều này. Các ứng dụng như vậy có thể phụ thuộc vào các mô-đun python cụ thể, có thể không chuẩn, đang được cài đặt mà phiên bản bạn đã cài đặt có thể không có. Ví dụ trên Ubuntu, tôi tin rằng một số công cụ HĐH tích hợp được viết bằng Python sử dụng ORM có tên Storm không phải là một phần của thư viện chuẩn Python. Bản cài đặt Python 2.7 sạch của bạn có cài đặt phiên bản dự kiến ​​cụ thể của mô-đun Storm không? Nó có phiên bản nào của Storm không? Không? Sau đó, bạn vừa phá vỡ một đoạn hệ điều hành của mình.

Cách đúng đắn để làm điều này là cài đặt phiên bản python ưa thích của bạn và thiết lập tài khoản người dùng của bạn để sử dụng nó bằng cách thiết lập .bash_profile, đường dẫn, v.v. Bạn cũng có thể muốn xem xét mô-đun virtualenv cho Python.


1
Googled đường của tôi ở đây. Sẽ -1 nếu tôi có đại diện trên ngăn xếp này. Tại sao? Bởi vì phương pháp đề xuất chỉ nói "cài đặt phiên bản python ưa thích của bạn". Làm thế nào được thực hiện mà không hos hệ thống python?
jez

@jez Người dùng nên tham khảo hướng dẫn cài đặt cho sự lựa chọn ứng dụng và hệ điều hành của họ. Trong các gói cài đặt ngôn ngữ chung sẽ cài đặt đến một vị trí lành tính, không ghi đè lên các thành phần hệ điều hành lõi để ghi đè lên phiên bản HĐH sẽ là trường hợp đặc biệt.
Simon Hibbs

8

Làm thế nào để tôi sửa chữa mớ hỗn độn này?

Không có gì hơn là cài đặt lại python. Nó sẽ hoàn tác thay đổi của bạn (liên kết tượng trưng).

Tại sao bạn muốn nó như mặc định? Mỗi khi bạn cần nó, chỉ cần sử dụng python2.7hoặc bao gồm #!/usr/bin/python2.7(shebang) ở đầu tập lệnh (thực thi) của bạn.

Nếu bạn khăng khăng có python2.7mặc định toàn hệ thống, hãy sử dụng bản phát hành Ubuntu sau (hiện tại là Ubuntu 11.04, tên mã Natty). Nó sử dụng phiên bản đó làm mặc định.

Trong tương lai, tránh thực hiện các can thiệp thủ công như những gì bạn đã làm với điều liên kết tượng trưng. Điều này đặc biệt đúng đối với các tệp được quản lý distro và đặc biệt nhất đối với các quái thú phức tạp như cài đặt Python.


Tôi nghĩ rằng chỉ hợp lý để thay đổi cài đặt python mặc định khi tôi nâng cấp. Tôi muốn nó như mặc định vì tôi muốn làm việc với python mới hơn ... như mặc định. Khi tôi gõ pythontừ bash, tôi muốn lấy con trăn mới. Có cách nào tốt hơn để làm điều này hơn những gì tôi đã làm không?
ripper234

Chỉ cần lưu ý - Tôi không nghĩ có gì sai trong cách tôi cài đặt python 2.7. Động thái "không chính thống" duy nhất là thay đổi liên kết tượng trưng, ​​mà tôi nghĩ là cách thích hợp để đặt nó làm mặc định. Có cách nào tốt hơn?
ripper234

2
@ripper: Tôi đoán là tôi đến chủ đề này hơi muộn. Như Tshepang nói pythongói trên Ubuntu xác định phiên bản hệ thống. Bây giờ, có thể tùy chỉnh cài đặt của bạn để python 2.7 được mặc định bằng cách tạo gói python của riêng bạn, v.v., nhưng nếu vậy, bạn sẽ trở thành người duy trì cài đặt Python thay vì Ubuntu và bạn sẽ phải tìm hiểu cách Python được quản lý trên Debian / Ubuntu. Hãy nhớ rằng các gói Python khác trong hệ thống được cấu hình để hoạt động với 2.6 như mặc định, do đó, ngoài bất kỳ điều gì khác, sự cố có thể xảy ra.
Faheem Mitha

1
@Tshepang: Tóm tắt tốt!
Faheem Mitha

12
@ ripper234: Đừng thay đổi bất cứ điều gì /usr/bin, đó là dành riêng cho phân phối của bạn. Thay vào đó, tạo /usr/local/bin/pythonmột liên kết tượng trưng đến python2.7. Sau đó, các tập lệnh sử dụng #!/usr/bin/env python(thành ngữ được đề xuất), cũng như gõ pythonvào dòng lệnh, sẽ chạy Python 2.7. Các tập lệnh từ bản phân phối muốn Python từ bản phân phối có thể tiếp tục gọi #!/usr/bin/python.
Gilles 'SO- ngừng trở nên xấu xa'

2

Tuyên bố từ chối trách nhiệm: tôi vừa đăng câu trả lời tương tự này lên stack overflow:

/programming/2812520/pip-deals-with-multipl-python-versions/50319252

Đây là vấn đề của tôi. Hoạt động cho Python3. Các tính năng chính là:

  • Mỗi phiên bản Python được biên dịch từ nguồn
  • Tất cả các phiên bản được cài đặt cục bộ
  • Không quản lý cài đặt Python mặc định của hệ thống của bạn theo bất kỳ cách nào
  • Mỗi phiên bản Python được phân lập bằng virtualenv

Các bước thực hiện như sau:

  1. Nếu bạn có một số phiên bản python bổ sung được cài đặt theo một cách khác, hãy loại bỏ chúng, ví dụ: xóa $ HOME / .local / lib / python3.x , v.v. (cũng là các phiên bản được cài đặt trên toàn cầu). Đừng chạm vào phiên bản python3 mặc định của hệ thống của bạn.

  2. Tải xuống nguồn cho các phiên bản python khác nhau theo cấu trúc thư mục sau:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. Tại mỗi thư mục "Python-3.xy /", hãy làm như sau ( KHÔNG sử dụng "sudo" trong bất kỳ bước nào!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. Tại "python_versions /" tạo các tệp như thế này:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Bây giờ, bất cứ lúc nào bạn muốn chọn python3.x, hãy làm

    source $HOME/python_versions/env_python3x.bash

    để vào virtualenv

  6. Khi ở trong virtualenv, hãy cài đặt các gói python yêu thích của bạn với

    pip install --upgrade package_name
  7. Để thoát phiên bản virtualenv và python, chỉ cần gõ "hủy kích hoạt"


0

Chúng tôi đặt nhiều bản phân phối python trên Mac và Ubuntu rất nhiều và đây là khuyến nghị của tôi.

  1. Để hệ thống python không bị biến dạng: không bao giờ sử dụng nó.

  2. Nếu bạn chỉ cần một bản phân phối python chính, hãy tải xuống và cài đặt Canopy từ enth think. Khi cài đặt, chọn "đặt làm python hệ thống của tôi", sau đó bạn có thể cài đặt các gói từ trình quản lý gói GUI của Canopy.

    • Canopy cũng có thể ra khỏi hộp với piplệnh quản lý gói PyPi cho phép bạn cài đặt các gói (ví dụ pip install python-twitter)
  3. Nếu bạn có kế hoạch sử dụng các môi trường ảo (tức là bạn đang phát triển các chương trình python và muốn có một môi trường python sạch dành riêng cho từng môi trường, với một phương tiện dễ dàng để chuyển đổi giữa chúng), tôi khuyên bạn nên dùng Anaconda qua Canopy vì công cụ quản lý môi trường ảo này . Điều này sẽ cho phép bạn

0

pyenv

https://github.com/pyenv/pyenv

Pyenv cho phép bạn quản lý nhiều phiên bản Python mà không cần sudo cho một người dùng, giống như Node.js NVMRuby RVM .

Cài đặt Pyenv:

curl https://pyenv.run | bash

Sau đó thêm vào .bashrc:

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Tìm phiên bản Python để cài đặt:

pyenv install --list

Cài đặt phiên bản python bạn muốn:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Liệt kê các phiên bản Python có sẵn:

pyenv versions

Chúng tôi hiện có:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Chọn một phiên bản python khác nhau:

pyenv global 3.8.0
python --version
python3 --version

Cả hai đầu ra:

Python 3.8.0

Bây giờ chúng ta có thể tiến hành cài đặt và sử dụng các gói thông thường:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Chúng tôi có thể xác nhận rằng mọi thứ được cài đặt cục bộ trong môi trường sạch của chúng tôi với:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

Mỗi dự án sử dụng

Trong phần trước, chúng ta đã thấy cách sử dụng pyenv trong một thiết lập toàn cầu.

Tuy nhiên, những gì bạn thường muốn là đặt một phiên bản gói và python cụ thể trên cơ sở từng dự án. Đây là cách để làm điều đó.

Đầu tiên cài đặt phiên bản Python mong muốn của bạn như trước.

Sau đó, từ bên trong thư mục dự án của bạn, đặt phiên bản python mong muốn với:

pyenv local 3.8.0

tạo một tệp .python-versionchứa chuỗi phiên bản.

Và bây giờ, hãy cài đặt một gói cục bộ chỉ dành cho dự án của chúng tôi: TODO: dường như không có cách nào hay: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Bây giờ, khi ai đó muốn sử dụng dự án của bạn, họ sẽ làm:

pyenv local

trong đó thiết lập phiên bản Python thành phiên bản chính xác.

Chủ đề liên quan:

Đã thử nghiệm trên Ubuntu 18.04, pyenv 1.2.15.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.