Làm cách nào để tạo lệnh chương trình 'python' thực thi Python 3?


331

Lệnh pythonchương trình thực thi Python 2. Python 3 có thể được thực thi bằng python3lệnh. Làm thế nào Python 3 có thể được thực thi bằng pythonlệnh?


30
Chỉ là một cảnh báo: Không cố gắng thay đổi liên kết / usr / bin / python để trỏ đến python3 thay vì 2.7. Nhiều chương trình có sẵn trong kho Repos yêu cầu / usr / bin / python tương thích với python 2.x.
soulsource

1
À, giờ tôi đã hiểu ý của bạn khi nâng cấp ... Thực ra các nhà phát triển Ubuntu đang làm việc trên đó: wiki.ubfox.com/Python/3 "Đó là mục tiêu phát hành cho Ubuntu 14.04 LTS chỉ có Python 3 trên CD máy tính để bàn hình ảnh. "
soulsource

1
Một lưu ý khác, bất kỳ ai đến đây vì họ đang cố gắng tìm hiểu về việc tạo Python 3 mặc định, thay vào đó, có thể tìm thấy sử dụng trong nghiên cứu môi trường ảo (ví dụ virtualenv) hoặc container (ví dụ LXC hoặc Docker).
Kevin

1
Để tham khảo cảnh báo của soulsource ở đầu, hãy xem PEP 394 , tiêu chuẩn hóa các quy ước đặt tên cho các tệp thực thi Python cùng tồn tại và dựa trên đó các lập trình viên và người bảo trì gói Python làm (và nên) dựa vào.
David foerster

2
@wjandrea, có ngay cả trong một môi trường ảo, pythonnên được giữ nguyên nghĩa python2. Tôi có nghĩa là nhận xét của tôi như là một cách để có một phiên bản Python cụ thể của ứng dụng thay vì cố gắng làm việc xung quanh Python của hệ thống.
Kevin

Câu trả lời:


370

Một cách an toàn đơn giản sẽ là sử dụng bí danh. Đặt cái này vào ~/.bashrchoặc ~/.bash_aliasestập tin:

alias python=python3

Sau khi thêm ở trên trong tập tin, chạy source ~/.bashrchoặc source ~/.bash_aliases.

Ví dụ:

$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ alias python=python3
$ python --version
Python 3.4.3

Để phá vỡ bí danh, sử dụng commandlệnh tích hợp:

$ command python --version
Python 2.7.6

Một cách khác để phá vỡ bí danh là sử dụng \trước lệnh.

$ \python --version 
Python 2.7.6

Để vô hiệu hóa bí danh trong trình bao hiện tại, hãy sử dụng unaliaslệnh tích hợp:

$ unalias python
$ python --version
Python 2.7.6

1
vì vậy không có tùy chọn "nâng cấp" .. ??
Giri

4
thực sự tôi muốn xóa sạch 2.7 và thay thế nó bằng 3.3. Có vẻ như đó là một ý tưởng tồi cho đến bây giờ ..
Giri

35
+1 không có lý do gì để thanh lọc 2.7 để có thể hoạt động với 3.3. Vì rất nhiều phần mềm vẫn phụ thuộc vào 2.7; chỉ cần giữ nó ở lại
don.joey 17/07/13

6
@begueradj Một bí danh hoàn toàn khác với một liên kết tượng trưng .
Radu Rădeanu

1
Một lời cảnh báo: điều này có thể phá vỡ các tập lệnh khác mong đợi Python 2.7.
kmiklas

85

[Tháng 6 năm 2016] Nơi được đề xuất cho thông tin về quá trình chuyển đổi là trang Ubuntu Python chính thức .


Từ wiki Ubuntu :

Đối với cả Ubuntu và Debian, chúng tôi có các mục tiêu dự án đang thực hiện để biến Python 3 thành phiên bản Python mặc định, ưa thích trong các bản phát hành.

Điều này không có nghĩa là:

  • /usr/bin/pythonsẽ chỉ vào Python 3. Không, điều này sẽ không xảy ra (trừ khi PEP 394 ủng hộ cách khác, điều này đáng nghi ngờ cho tương lai gần). /usr/bin/python/usr/bin/python2sẽ trỏ tới Python 2.7 và /usr/bin/python3sẽ trỏ đến phiên bản Python 3 được hỗ trợ mới nhất.

  • Python 2 sẽ bị xóa khỏi kho lưu trữ. Không, điều này sẽ không xảy ra . Chúng tôi hy vọng Python 2.7 vẫn được hỗ trợ và có sẵn trong Ubuntu trong một thời gian khá dài, do PEP 373 hứa hẹn hỗ trợ bảo trì sửa lỗi ngược dòng cho đến năm 2020.

Không nên thay đổi liên kết tượng trưng vì các phụ thuộc gói khác, nhưng chúng "có các mục tiêu dự án đang diễn ra để biến Python 3 thành phiên bản Python mặc định, ưa thích trong các bản phát hành".


Để sử dụng CLI, như @Radu Rădeanu , tôi khuyên bạn nên đặt bí danh cho người dùng ~/.bashrc, .bash_aliasestệp (các tệp khác nhau, bao gồm ~/.bash_profile, được tải ít nhất một lần, chủ yếu cho mục đích tổ chức, nhưng có thể khác nhau tùy theo nền tảng). Môi trường ảo Python cũng hoạt động tốt.

Ví dụ bí danh:

alias python=python3

hoặc là

alias python='/usr/bin/python3'

Các kịch bản vẫn nên sử dụng một cái gì đó như #!/usr/bin/env python3để tương thích chéo.

Sử dụng envlà tốt để sử dụng hỗn hợp với môi trường ảo.

Lưu ý (nhờ @wjandrea): bí danh là một phần của thời gian chạy bash, không phải môi trường người dùng. Do đó, chúng không có sẵn cho shebang ( #!). Nếu bạn thích bí danh python = python3, thì một số program.pykhông có shebang có thể được thực thi bằng cách gọi trình thông dịch bí danh như thế này python program.py. Bí danh cũng có thể hữu ích cho các hệ thống có nhiều phiên bản python3 như 3,4 và 3.6 cùng nhau.


1
Điều này dường như đã lỗi thời: họ dự định loại bỏ python2 trong Xenial, nhưng sau đó thì không.
OrangeDog

1
@OrangeDog, cảm ơn đã cập nhật. Có, trang wiki mà tôi đã trích dẫn hiện được gắn cờ là lỗi thời, vì đã có nhiều tiến bộ hơn trong hai năm qua khi chỉ chuyển sang Python 3. Trang mới để theo dõi tiến trình này là trang Ubuntu Python chính thức .
Kevin

Trang "mới nhất" cũng đã hết hạn, liên quan đến các kế hoạch cho Xenial.
OrangeDog

Tôi sẽ không nói rằng nó "lỗi thời" nhiều như "nó chưa được cập nhật gần đây." Nó dường như vẫn là vị trí hiện tại để giữ bài viết về điều này. Tuy nhiên, trong các bình luận ở đây, tôi sẽ đánh giá cao bất kỳ nguồn nào khác gần đây mà bất cứ ai cũng có thể tìm thấy. Thêm nhiều nguồn vào câu trả lời của tôi, về lý do tại sao không thực hiện thay đổi thành chỉ python, không thực sự phù hợp cho đến khi chuyển đổi hoàn tất. Ngay cả sau đó, nó có thể chỉ trở thành một vấn đề.
Kevin

2
Bí danh là nội bộ của Bash, không phải là một phần của môi trường, vì vậy bạn vẫn sẽ cần sử dụng python3trong một shebang, không python.
wjandrea

28

Cập nhật: Đây là cách sai, tôi đã học được, vì Python2 và Python3 không thể thay thế cho nhau.

Bạn có thể thử công cụ dòng lệnh update-alternatives.

$ sudo update-alternatives --config python

Nếu bạn gặp lỗi "không có lựa chọn thay thế cho python" thì hãy tự thiết lập một giải pháp thay thế bằng lệnh sau:

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

Thay đổi đường dẫn /usr/bin/python3đến phiên bản python mong muốn của bạn cho phù hợp.


19
python2 và python3 không phải là lựa chọn thay thế. Không sử dụng thay thế cập nhật cho mục đích này.
ngày

Tại sao họ không? Một trong các bạn có thể giải thích tại sao update-alternativeskhông phù hợp với trăn không? Có phải vì legacy.python.org/dev/peps/pep-0394 ?
Dmitry Grigoryev

11
lựa chọn thay thế là thực hiện khác nhau cho cùng một chức năng. python2 và python3 không cung cấp các chức năng giống nhau.
Ely

Bạn có thể làm một cái gì đó như thế này nếu bạn cài đặt thủ công (thông qua ppa hoặc bất cứ điều gì) các phiên bản khác của python3. sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
David Baucum

Đây là những gì tôi cần làm cho một 18.04.2 vm không đi kèm với trăn. Cảm ơn
Dark Star1

9

Ubuntu và phần còn lại của các bản phân phối Linux cho vấn đề đó, vẫn chủ yếu phụ thuộc vào Python 2.7 cho một số ứng dụng và lệnh. Nếu bạn thay đổi tham chiếu mặc định của "python" thành Python 3.x, thì một số hàm Python sẽ bắt đầu đưa ra các lỗi xác nhận.

Ví dụ: trên Ubuntu, 'pip' cho một người sẽ không còn chạy chính xác trừ khi bạn trực tiếp chỉnh sửa tệp và thay đổi shebang thành tham chiếu '#! / Usr / bin / env python2.7'. Trên các hương vị của RHEL (Red Hat Enterprise Linux) như Red Hat, Fedora và CentOS, lệnh 'Yum' cũng phụ thuộc vào Python 2.7.

Quan điểm của tôi ở đây là bạn sẽ khiến một lượng mã đáng kể bắt đầu ném các lỗi xác nhận chỉ để bạn có thể nhập 'python' trong thiết bị đầu cuối để tham chiếu Python 3.x.

Bạn sẽ tốt hơn nhiều khi sử dụng lệnh 'python3' trong thiết bị đầu cuối và shebang '#! / Usr / bin / env python3' trong các tệp Python 3.x của bạn.


2

Làm

cd ~
gedit .bash_aliases

sau đó viết

alias python=python3

hoặc là

alias python='/usr/bin/python3'

Lưu tệp, đóng thiết bị đầu cuối và mở lại.
Liên kết


1

Bạn có thể liên kết mềm /usr/bin/pythonđến python3với

sudo ln -s /usr/bin/python3 /usr/bin/python

và bạn có thể ngăn Python 2 và pip2 được cài đặt như một phần phụ thuộc với

sudo apt-mark hold python python-pip

Xem các câu trả lời khác cho lý do tại sao bạn có thể không muốn làm điều này. Ubuntu 18.04+ không còn đi kèm với Python 2, vì vậy nó không quá tệ.


2
Về "Ubuntu 18.04 không còn đi kèm với Python 2, vì vậy nó không quá tệ." , trên Ubuntu (ngay cả các phiên bản không cài đặt Python 2 theo mặc định), một tệp thực thi được gọi pythonlà Python 2, do đó, điều này có thể phá vỡ một số thứ.
wjandrea

* python->/usr/bin/python
wjandrea

0
cat > /usr/local/bin/py
#!/bin/dash
python3 "$@"
<CTRL-D>

(miễn là bạn có quyền viết thư cho / usr / local / bin) tương tự

cat > /usr/local/bin/pyi
#!/bin/dash
python3 -i "$@"
<CTRL-D>

sau đó bạn chỉ nhập py (và sử dụng py trong dòng #!) cho python đã chọn của bạn.


Nó sẽ không đơn giản hơn để sử dụng một liên kết tượng trưng? sudo ln -s /usr/bin/python3 /usr/local/bin/py
wjandrea

0

Tôi thấy nó rất hữu ích khi chỉ cần loại bỏ / usr / bin / python và / usr / bin / pip. Điều này buộc tất cả các chương trình phải dựa vào lệnh "python2" và "python3".

Mặc dù một số gói tùy chọn và lỗi thời phụ thuộc vào #!/usr/bin/pythoncông việc, tôi thà gửi các bản vá cho các chương trình đó hơn là tiếp tục mắc các lỗi lạ và đôi khi khó gỡ lỗi.


-1

Bạn có thể sử dụng update-alternativesđể cung cấp các phiên bản chương trình khác nhau có thể cần thiết vào các thời điểm khác nhau do các vấn đề tương thích.

Câu trả lời này là một ví dụ tốt cho cách thiết lập mọi thứ để duy trì đồng thời các phiên bản khác nhau của gcc / g ++.

chỉ cần làm tương tự với python2.7 và python 3.3


2
Người dùng mới bắt đầu có thể không dễ dàng điều chỉnh câu trả lời được liên kết với một tình huống khác. Ngoài việc ghi có câu trả lời trước đó, sẽ tốt hơn nếu bạn đưa ra các bước cần thiết cho Python.
chaskes

Đây là tôi tìm thấy bước tốt bởi giải pháp bước linuxconfig.org/...
woto

Python 2 và 3 không thay thế - ngay cả các phiên bản nhỏ khác nhau cũng không ( ví dụ ). Phương pháp này có thể dễ dàng phá vỡ mọi thứ.
wjandrea

Ngoài ra đây là bản sao của câu trả lời này
wjandrea
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.