Hai phiên bản của python trên linux. Cách tạo 2.7 mặc định


124

Tôi đã có hai phiên bản python trên linuxbox của mình:

$python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 


$ /usr/local/bin/python2.7
Python 2.7.3 (default, Oct  8 2013, 15:53:09) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$ which python
/usr/bin/python
$ ls -al /usr/bin/python
-rwxr-xr-x. 2 root root 4864 Jul 10 22:49 /usr/bin/python

Làm cách nào tôi có thể biến 2.7 thành phiên bản mặc định để khi tôi nhập pythonnó sẽ đưa tôi vào 2.7?


1
Khi tôi làm điều này với fedora của tôi, yum hoặc apt-get không còn hoạt động nữa.
Người dùng

@ Người dùng: Vâng, tôi đã phá vỡ một Mandrake cổ đại tương tự (đổi /usr/bin/env pythonthành trung bình 2.6 thay vì 2.3 có nghĩa là một nửa số lệnh trong rpmvà tất cả urpmiđã ngừng hoạt động).
abarnert

Tôi đã làm theo bước sau để cài đặt Django trên Centos 5: 1st, cài đặt Python 3.6 từ mã nguồn. 2nd: in shell type lệnh sau "alias python = / usr / local / bin / python3.6" 2nd: chạy lệnh sau để cài đặt Django "pip3 cài đặt Django" 4th: "python -m django --version" để xác minh Django được cài đặt với phiên bản "1.10.5"
showmyroutes

đối với tôi /usr/bin/pythonlà một liên kết mềm chỉ đến python2. Tôi vừa đổi nó thànhpython3.6
munish

Câu trả lời:


173

Bạn có thể không thực sự muốn thay đổi Python mặc định của bạn.

Bản phân phối của bạn đã cài đặt một Python hệ thống tiêu chuẩn /usr/binvà có thể có các tập lệnh phụ thuộc vào sự hiện diện này và được chọn bởi #! /usr/bin/env python. Bạn thường có thể thoát khỏi việc chạy các tập lệnh Python 2.6 trong 2.7, nhưng bạn có muốn mạo hiểm không?

Trên hết, việc đánh lừa có /usr/binthể phá vỡ khả năng quản lý gói của bạn. Và việc thay đổi thứ tự các thư mục trong bạn PATHsẽ ảnh hưởng đến rất nhiều thứ khác ngoài Python. (Trong thực tế, nó phổ biến hơn để có /usr/local/bintrước /usr/bin, và nó có thể là những gì bạn thực sự muốn-nhưng nếu bạn có nó theo cách khác xung quanh, có lẽ có một lý do chính đáng cho điều đó.)

Nhưng bạn không cần thay đổi Python mặc định của mình để hệ thống chạy 2.7 khi bạn nhập python.


Đầu tiên, bạn có thể thiết lập bí danh shell:

alias python=/usr/local/bin/python2.7

Nhập vào dấu nhắc hoặc đặt nó vào ~/.bashrcnếu bạn muốn thay đổi được duy trì và bây giờ khi bạn nhập pythonnó, bạn đã chọn 2.7, nhưng khi một số chương trình trên hệ thống của bạn cố chạy tập lệnh với /usr/bin/env pythonnó chạy chuẩn 2.6.


Ngoài ra, chỉ cần tạo một môi trường ảo trong số 2.7 (hoặc các venv riêng biệt cho các dự án khác nhau) và thực hiện công việc của bạn bên trong venv.


1
:( bạn nói đúng. Thật không may, tôi đã tạo một liên kết symb mới theo câu trả lời của @ rohit. Bây giờ yumlệnh của tôi không hoạt động! Tôi đã thử tạo liên kết sym trở lại nhưng nó không hoạt động sudo ln -sf /usr/bin/python2.6 /usr/bin/pythongì cả?
Anthony

@Anthony: Tôi đoán rằng /usr/bin/pythontrước đây không phải là một liên kết tượng trưng, ​​nó là một tập lệnh bao bọc hoặc có thể thực thi được và bây giờ bạn đã ghi đè lên nó và không thể lấy lại được. Nếu rpmvẫn hoạt động, bạn có thể tải xuống gói Python theo cách thủ công và cài đặt mà không cần yum.
abarnert

Tôi vẫn có thể nhận được phiên dịch 2.6 khi tôi gõ python2.6để nó vẫn ở đó.
Anthony

7
@Anthony: Và trong tương lai, nếu ai đó bảo bạn thay đổi công cụ trong / usr / bin (hoặc bất cứ nơi nào trong / usr ngoài / usr / local), hãy ghi lại những gì ở đó và một bản sao lưu
abarnert

thật là một mớ hỗn độn tồi tệ Tôi có một hộp centos khác có thể có kịch bản đó. Nếu tôi sao chép nó từ đó và đặt nó vào / usr / bin của hộp này. Bạn có nghĩ rằng nó sẽ làm việc?
Anthony

19

Thêm vào biến môi trường /usr/local/bincủa bạn PATH, sớm hơn trong danh sách hơn /usr/bin.

Nói chung, điều này được thực hiện trong tệp RC của shell của bạn, ví dụ như đối với bash, bạn sẽ đặt nó vào .bashrc:

export PATH="/usr/local/bin:$PATH"

Điều này sẽ làm cho vỏ của bạn trông đầu tiên cho một pythontrong /usr/local/bin, trước khi nó đi với một trong /usr/bin.

(Tất nhiên, điều này có nghĩa là bạn cũng cần phải có /usr/local/bin/pythonđiểm python2.7- nếu chưa có, bạn sẽ cần liên kết với nó.)


Có thể cần phải thiết lập PYTHONHOME một cách thích hợp / bỏ đặt nó nếu nó được đặt bởi một cái gì đó.
Marcin

1
Điều này gần như không nguy hiểm như các giải pháp đề xuất thay đổi / usr / bin chính nó nhưng tôi vẫn nghĩ đó không phải là điều OP thực sự muốn.
abarnert

Điều này đã giúp tôi sau khi nâng cấp từ Ubuntu 14.x lên 16.x
learn2day

4

Xác minh phiên bản hiện tại của python bằng cách:

$ python --version

sau đó kiểm tra python là liên kết tượng trưng đến tập tin nào.

  $ ll /usr/bin/python

Ví dụ đầu ra:

 lrwxrwxrwx 1 root root 9 Jun 16  2014 /usr/bin/python -> python2.7*

Kiểm tra các phiên bản có sẵn khác của python:

$ ls /usr/bin/python*

Ví dụ đầu ra:

/usr/bin/python     /usr/bin/python2.7-config  /usr/bin/python3.4         /usr/bin/python3.4m-config  /usr/bin/python3.6m         /usr/bin/python3m
/usr/bin/python2    /usr/bin/python2-config    /usr/bin/python3.4-config  /usr/bin/python3.6          /usr/bin/python3.6m-config  /usr/bin/python3m-config
/usr/bin/python2.7  /usr/bin/python3           /usr/bin/python3.4m        /usr/bin/python3.6-config   /usr/bin/python3-config     /usr/bin/python-config

Nếu muốn thay đổi phiên bản hiện tại của python thành tệp chỉnh sửa phiên bản 3.6 ~ / .bashrc:

vim ~/.bashrc

thêm dòng dưới đây vào cuối tập tin và lưu:

alias python=/usr/local/bin/python3.6

Để cài đặt pip cho python 3.6

$ sudo apt-get install python3.6 python3.6-dev
$ sudo curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python3.6
$ sudo easy_install pip

Khi thành công, hãy kiểm tra phiên bản hiện tại của pip:

$ pip3 -V

Ví dụ đầu ra:

pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.6)

3

Nhập lệnh

which python

//output:
/usr/bin/python

cd /usr/bin
ls -l

Ở đây bạn có thể thấy một cái gì đó như thế này

lrwxrwxrwx 1 root   root            9 Mar  7 17:04  python -> python2.7

python2.7 mặc định của bạn được liên kết mềm với văn bản 'python'

Vì vậy, loại bỏ python softlink

sudo rm -r python

sau đó thử lại lệnh trên

ls -l

bạn có thể thấy phần mềm được gỡ bỏ

-rwxr-xr-x 1 root   root      3670448 Nov 12 20:01  python2.7

Sau đó tạo một liên kết mềm mới cho python3.6

ln -s /usr/bin/python3.6 trăn

Sau đó thử lệnh pythontrong terminal

//output:
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux

help, copyright, creditshoặc licenseđể biết thêm thông tin.


1
Bài viết của bạn không phải là một câu trả lời cho câu hỏi của OP.
Frank

Điều này giải quyết một vấn đề rất kỳ lạ đối với tôi. Khi tôi kiểm tra phiên bản python từ root hoặc terminal bình thường, nó hiển thị 3.6.8 nhưng nếu tôi tạo một .sh và gõ python -version bên trong, thì nó được in 2.7. Hóa ra đó là vì một liên kết mềm đã tồn tại như đã đề cập ở trên. Thực hiện theo các bước và nó đã được sửa. Cảm ơn.
S4nd33p

Cảm ơn bạn! Điều này đã giải quyết cho tôi vấn đề "bắt buộc trăn 3 trở lên"
Tamim Attafi

2

Tất cả các hệ điều hành đi kèm với một phiên bản mặc định của python và nó nằm trong / usr / bin. Tất cả các tập lệnh đi kèm với HĐH (ví dụ yum) đều chỉ ra phiên bản python này nằm trong / usr / bin. Khi bạn muốn cài đặt một phiên bản mới của python, bạn không muốn phá vỡ các tập lệnh hiện có có thể không hoạt động với phiên bản mới của python.

Cách đúng đắn để làm điều này là cài đặt python như một phiên bản thay thế.

e.g.
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2 
tar xf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure --prefix=/usr/local/
make && make altinstall

Bây giờ bằng cách thực hiện điều này, các tập lệnh hiện có như yum vẫn hoạt động với / usr / bin / python. và phiên bản python mặc định của bạn sẽ là phiên bản được cài đặt trong / usr / local / bin. tức là khi bạn gõ python bạn sẽ nhận được 2.7.3

Điều này xảy ra bởi vì. Biến $ PATH có / usr / local / bin trước usr / bin.

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

Nếu python2.7 vẫn không có hiệu lực như phiên bản python mặc định, bạn sẽ cần phải làm

export PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"

-8

Tôi đoán bạn đã cài đặt phiên bản 2.7 theo cách thủ công, trong khi 2.6 đến từ gói?

Câu trả lời đơn giản là: gỡ cài đặt gói python.

Cái phức tạp hơn là: không cài đặt thủ công trong / usr / local. Xây dựng một gói với phiên bản 2.7 và sau đó nâng cấp.

Xử lý gói phụ thuộc vào phân phối bạn sử dụng.


5
Gói Python gần như chắc chắn được yêu cầu bởi distro. CentOS dựa trên RPM và một nửa công cụ RPM và YUM được viết bằng Python.
abarnert

Michael thân mến, Xin vui lòng tư vấn tùy chọn để gỡ cài đặt thủ công python2.7!
AVA

Giải pháp đơn giản sẽ là xóa mọi thứ trong / usr / local / nhưng theo cách này bạn xóa mọi thứ bạn đã biên dịch và cài đặt thủ công. Không có cách nào tốt để theo dõi tập tin nào thuộc về phần mềm nào trong / usr / local và vì lý do này, cài đặt bất cứ thứ gì thường không được khuyến khích. Có lẽ bạn chỉ có trăn ở đó. Nếu / usr / local / bin chỉ chứa các tệp thực thi python, bạn có khả năng loại bỏ sẽ không phá vỡ bất cứ thứ gì khác.
emesik

2
Bạn không bao giờ nên gỡ cài đặt python. Lấy cái này từ tôi Tôi đã làm nó và nó đã phá vỡ hệ thống của tôi. Rất nhiều ứng dụng phụ thuộc vào nó. Điều này rất không được khuyến khích.
Patrick Mutwiri
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.