จะทำให้คำสั่งโปรแกรม 'python' รัน Python 3 ได้อย่างไร


331

pythonคำสั่งโปรแกรมรันงูหลามงูหลาม 2 3 สามารถดำเนินการได้โดยใช้python3คำสั่ง Python 3 สามารถดำเนินการโดยใช้pythonคำสั่งได้อย่างไร


30
เพียงคำเตือน: อย่าพยายามเปลี่ยน / usr / bin / python symlink ให้ชี้ไปที่ python3 แทน 2.7 หลายโปรแกรมที่มีใน repos ของ Ubuntu ต้องการ / usr / bin / python เพื่อให้รองรับกับ python 2.x
Soulsource

1
อ่าตอนนี้ฉันได้สิ่งที่คุณต้องการด้วยการอัพเกรด ... ที่จริงแล้วนักพัฒนา Ubuntu กำลังทำงานอยู่นั่น: wiki.ubuntu.com/Python/3 "มันเป็นเป้าหมายการวางตลาดสำหรับ Ubuntu 14.04 LTS ที่จะมีเพียง Python 3 บนซีดีเดสก์ท็อป ภาพ."
Soulsource

1
ในบันทึกอื่น ๆ ทุกคนที่มาที่นี่เพราะพวกเขากำลังพยายามเรียนรู้เกี่ยวกับการทำให้ Python 3 เป็นค่าเริ่มต้น แต่อาจหาใช้ในการวิจัยสภาพแวดล้อมเสมือน (เช่น virtualenv) หรือคอนเทนเนอร์ (เช่น LXC หรือ Docker)
เควิน

1
ในการอ้างอิงถึงคำเตือนของ Soulsource ที่ด้านบนดูPEP 394ซึ่งเป็นมาตรฐานของการตั้งชื่อสำหรับการใช้งานร่วมกันของ Python และ Python โปรแกรมเมอร์และผู้ดูแลแพคเกจทำ (และควร) พึ่งพา
David Foerster

2
@wjandrea ใช่แม้ในสภาพแวดล้อมเสมือนจริงควรจะเก็บไว้เป็นความหมายpython python2ฉันหมายถึงความคิดเห็นของฉันเป็นวิธีที่จะมีแอพพลิเคชั่น Python เวอร์ชั่นที่เฉพาะเจาะจงแทนที่จะพยายามหลีกเลี่ยง Python ของระบบ
Kevin

คำตอบ:


370

วิธีที่ง่ายและปลอดภัยคือใช้นามแฝง วางสิ่งนี้ลงในไฟล์~/.bashrcหรือ~/.bash_aliases:

alias python=python3

หลังจากที่เพิ่มดังกล่าวข้างต้นในแฟ้มเรียกใช้หรือsource ~/.bashrcsource ~/.bash_aliases

ตัวอย่างเช่น:

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

ในการหลีกเลี่ยงนามแฝงให้ใช้commandคำสั่งในตัว:

$ command python --version
Python 2.7.6

อีกวิธีในการหลีกเลี่ยงนามแฝงคือใช้\ก่อนคำสั่ง

$ \python --version 
Python 2.7.6

หากต้องการปิดใช้งานนามแฝงในเชลล์ปัจจุบันให้ใช้unaliasคำสั่งในตัว:

$ unalias python
$ python --version
Python 2.7.6

1
ดังนั้นไม่มีตัวเลือก "อัพเกรด" .. ??
Giri

4
จริง ๆ แล้วฉันต้องการลบ 2.7 และแทนที่ด้วย 3.3 ดูเหมือนความคิดที่ไม่ดีสำหรับตอนนี้ ..
อีหนู

35
+1 ไม่มีเหตุผลที่จะทำการล้าง 2.7 เพื่อให้สามารถทำงานกับ 3.3 ได้ เนื่องจากซอฟต์แวร์จำนวนมากยังคงขึ้นอยู่กับ 2.7; เพียงแค่ให้มันอืดอาดไปรอบ ๆ
don.joey

6
@begueradj นามแฝงนั้นแตกต่างจากลิงก์สัญลักษณ์ทั้งหมด
Radu Rădeanu

1
คำเตือน: นี่อาจทำให้สคริปต์อื่น ๆ ที่คาดหวังว่า Python 2.7
kmiklas

85

[มิถุนายน 2559]สถานที่ที่แนะนำสำหรับข้อมูลเกี่ยวกับการเปลี่ยนหน้าอย่างเป็นทางการของUbuntu Python


จากWiki ของ Ubuntu :

สำหรับทั้ง Ubuntu และ Debian เรามีเป้าหมายโครงการอย่างต่อเนื่องเพื่อให้ Python 3 เป็นค่าเริ่มต้นและเป็นเวอร์ชัน Python ที่ต้องการใน distros

สิ่งนี้ไม่ได้หมายความว่า:

  • /usr/bin/pythonจะชี้ไปที่ Python 3 ไม่สิ่งนี้จะไม่เกิดขึ้น (เว้นแต่PEP 394 จะสนับสนุนอย่างอื่นซึ่งเป็นที่น่าสงสัยสำหรับอนาคตอันใกล้) /usr/bin/pythonและ/usr/bin/python2จะชี้ไปที่ Python 2.7 และ/usr/bin/python3จะชี้ไปที่เวอร์ชัน Python 3 ที่รองรับล่าสุด

  • Python 2 จะถูกลบออกจากไฟล์เก็บถาวร ไม่มีนี้จะไม่เกิดขึ้น เราคาดว่า Python 2.7 จะยังคงได้รับการสนับสนุนและพร้อมใช้งานใน Ubuntu เป็นเวลานานเนื่องจากPEP 373สัญญาว่าจะให้การสนับสนุนการบำรุงรักษาบั๊กอัปสตรีมจนถึงปี 2020

ไม่แนะนำให้เปลี่ยนการเชื่อมโยงสัญลักษณ์เนื่องจากการพึ่งพาแพ็คเกจอื่น ๆ แต่พวกเขา "มีเป้าหมายของโครงการอย่างต่อเนื่องเพื่อให้ Python 3 เป็นค่าเริ่มต้นและเวอร์ชัน Python ที่ต้องการใน distros"


สำหรับการใช้งาน CLI เช่น@Radu Rădeanuผมจะแนะนำให้วางนามแฝงในของผู้ใช้~/.bashrc, .bash_aliasesไฟล์ (ไฟล์ที่แตกต่างกันรวมทั้ง~/.bash_profileมีการโหลดอย่างน้อยหนึ่งครั้งส่วนใหญ่จะเป็นสำหรับวัตถุประสงค์ขององค์กร แต่อาจแตกต่างกันตามแพลตฟอร์ม) สภาพแวดล้อมเสมือนของ Python นั้นใช้งานได้ดีเช่นกัน

ตัวอย่างนามแฝง:

alias python=python3

หรือ

alias python='/usr/bin/python3'

สคริปต์ควรยังคงใช้สิ่งที่ต้องการ#!/usr/bin/env python3สำหรับความเข้ากันได้ข้าม

การใช้envดีสำหรับการใช้งานแบบผสมกับสภาพแวดล้อมเสมือนจริง

หมายเหตุ (ขอบคุณ @wjandrea): aliases เป็นส่วนหนึ่งของ bash runtime ไม่ใช่สภาพแวดล้อมผู้ใช้ ดังนั้นจึงไม่สามารถใช้กับ shebang ( #!) หากคุณต้องการนามแฝงหลาม = python3 แล้วบางส่วนprogram.pyโดยไม่ต้อง shebang อาจจะดำเนินการโดยการเรียกล่าม aliased python program.pyเช่นนี้ การใช้นามแฝงอาจมีประโยชน์สำหรับระบบที่มี python3 หลายเวอร์ชันเช่น 3.4 และ 3.6 ด้วยกัน


1
สิ่งนี้ดูเหมือนจะล้าสมัยแล้ว: พวกเขาวางแผนที่จะลบ python2 ใน Xenial แต่ก็ไม่ได้
OrangeDog

1
@OrangeDog ขอบคุณสำหรับการอัปเดต Yes, วิกิพีเดียหน้าผมอ้างถูกตั้งค่าสถานะตอนนี้ออกจากวันที่เป็นความคืบหน้ามากขึ้นได้ทำในอดีตที่ผ่านมาสองปีสำหรับการย้ายไปเพียงหลาม 3. หน้าใหม่ที่จะทำตามความก้าวหน้านี้เป็นอย่างเป็นทางการหน้า Ubuntu หลาม
Kevin

หน้า "ล่าสุด" ยังล้าสมัยเกี่ยวกับแผนสำหรับ Xenial
OrangeDog

ฉันจะไม่บอกว่ามันเป็น "ล้าสมัย" มากเท่ากับ "มันไม่ได้รับการปรับปรุงล่าสุด" ดูเหมือนว่าจะเป็นตำแหน่งปัจจุบันสำหรับเก็บโพสต์เกี่ยวกับเรื่องนี้ อย่างไรก็ตามในความคิดเห็นที่นี่ฉันจะขอบคุณแหล่งข้อมูลอื่น ๆ ล่าสุดที่ทุกคนอาจพบ การเพิ่มแหล่งข้อมูลเพิ่มเติมลงในคำตอบของฉันเกี่ยวกับสาเหตุที่จะไม่ทำการเปลี่ยนแปลงเพียงอย่างเดียวpythonนั้นไม่เกี่ยวข้องกันจนกว่าการแปลงจะเสร็จสมบูรณ์ แม้กระทั่งตอนนี้มันก็อาจจะกลายเป็นปัญหาที่ไม่ใช่
Kevin

2
นามแฝงนั้นเป็นของภายในของ Bash ไม่ใช่ส่วนหนึ่งของสภาพแวดล้อมดังนั้นคุณจะยังต้องใช้python3ในรูปแบบ shebang pythonด้วย
wjandrea

28

อัปเดต: นี่เป็นวิธีที่ผิดที่ฉันเรียนรู้เนื่องจาก Python2 และ Python3 ไม่สามารถใช้แทนกันได้

update-alternativesคุณสามารถลองใช้เครื่องมือบรรทัดคำสั่ง

$ sudo update-alternatives --config python

หากคุณได้รับข้อผิดพลาด "ไม่มีทางเลือกอื่นสำหรับไพ ธ อน" ให้ตั้งค่าตัวเลือกอื่นด้วยตัวเองด้วยคำสั่งต่อไปนี้:

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

เปลี่ยนพา ธ/usr/bin/python3ไปเป็นเวอร์ชั่นไพธ อนที่คุณต้องการ


19
python2 และ python3 ไม่ใช่ทางเลือก ห้ามใช้ทางเลือกการอัปเดตเพื่อจุดประสงค์นี้
jobin

ทำไมพวกเขาไม่? คุณคนหนึ่งช่วยอธิบายupdate-alternativesได้ไหมว่าทำไมจึงไม่เหมาะกับงูหลาม เป็นเพราะlegacy.python.org/dev/peps/pep-0394หรือไม่
Dmitry Grigoryev

11
ทางเลือกเป็นการใช้งานที่แตกต่างกันสำหรับฟังก์ชันการทำงานเดียวกัน python2 และ python3 ไม่ได้มีฟังก์ชั่นเดียวกัน
Ely

คุณสามารถทำสิ่งนี้ได้ถ้าคุณติดตั้งด้วยตนเอง (ผ่าน ppa หรืออะไรก็ตาม) python3 รุ่นอื่น sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
David Baucum

นี่คือสิ่งที่ฉันต้องทำเพื่อ 18.04.2 vm ที่ไม่ได้มาพร้อมกับหลาม ขอบคุณ
Dark Star1

9

Ubuntu และส่วนที่เหลือของ Linux distros สำหรับเรื่องนั้นยังคงขึ้นอยู่กับ Python 2.7 เป็นจำนวนมากสำหรับแอปพลิเคชันและคำสั่งจำนวนมาก หากคุณเปลี่ยนการอ้างอิงเริ่มต้นของ "python" เป็น Python 3.x ฟังก์ชัน Python จำนวนหนึ่งจะเริ่มโยนข้อผิดพลาดการยืนยัน

ตัวอย่างเช่นบน Ubuntu 'pip' สำหรับไฟล์หนึ่งจะไม่ทำงานอย่างถูกต้องเว้นแต่คุณจะแก้ไขไฟล์โดยตรงและเปลี่ยน shebang ให้อ้างอิง '#! / usr / bin / env python2.7' สำหรับ RHEL (Red Hat Enterprise Linux) รสชาติเช่น Red Hat, Fedora และ CentOS คำสั่ง 'Yum' ก็ขึ้นอยู่กับ Python 2.7 เช่นกัน

จุดของฉันที่นี่คือคุณจะทำให้รหัสจำนวนมากเริ่มโยนข้อผิดพลาดการยืนยันเพียงเพื่อให้คุณสามารถพิมพ์ 'หลาม' ใน terminal เพื่ออ้างอิง Python 3.x

คุณควรใช้คำสั่ง 'python3' ใน terminal และ shebang '#! / usr / bin / env python3' ในไฟล์ Python 3.x ของคุณ


2

ทำ

cd ~
gedit .bash_aliases

จากนั้นเขียนอย่างใดอย่างหนึ่ง

alias python=python3

หรือ

alias python='/usr/bin/python3'

บันทึกไฟล์ปิดเทอร์มินัลแล้วเปิดอีกครั้ง
ลิงค์


1

คุณสามารถ symlink /usr/bin/pythonไปpython3ด้วย

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

และคุณสามารถป้องกัน Python 2 และ pip2 จากการติดตั้งเป็นการอ้างอิงด้วย

sudo apt-mark hold python python-pip

ดูคำตอบอื่น ๆ สำหรับสาเหตุที่คุณอาจไม่ต้องการทำเช่นนี้ Ubuntu 18.04+ ไม่ได้มาพร้อมกับ Python 2 อีกต่อไปดังนั้นจึงไม่ควรเลวร้ายเกินไป


2
เกี่ยวกับ"Ubuntu 18.04 ไม่ได้มาพร้อมกับ Python 2 อีกต่อไปดังนั้นจึงไม่ควรเลวร้ายเกินไป" บน Ubuntu (แม้แต่รุ่นที่ไม่มีการติดตั้ง Python 2 โดยค่าเริ่มต้น) การเรียกใช้งานpythonจะถือว่าเป็น Python 2 ดังนั้นสิ่งนี้อาจทำให้บางสิ่งบางอย่างเสียหาย
wjandrea

* python->/usr/bin/python
wjandrea

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

(หากคุณได้รับอนุญาตเป็นลายลักษณ์อักษรถึง / usr / local / bin) เช่นเดียวกัน

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

จากนั้นคุณเพียงพิมพ์ py (และใช้ py ใน #! lines) สำหรับไพ ธ อนที่คุณเลือก


การใช้ symlink จะง่ายกว่าไหม sudo ln -s /usr/bin/python3 /usr/local/bin/py
wjandrea

0

ฉันคิดว่ามันมีประโยชน์มากในการลบ / usr / bin / python และ / usr / bin / pip สิ่งนี้บังคับให้ทุกโปรแกรมพึ่งพาคำสั่ง "python2" และ "python3"

แม้ว่าแพ็คเกจบางอย่างที่เป็นทางเลือกและล้าสมัยขึ้นอยู่กับ#!/usr/bin/pythonการทำงาน แต่ฉันอยากจะส่งแพตช์ไปยังโปรแกรมเหล่านั้นมากกว่าทำต่อไปเพื่อทำผิดพลาดแปลก ๆ และยากต่อการดีบัก


-1

คุณสามารถใช้update-alternativesเพื่อให้โปรแกรมรุ่นต่างๆที่อาจจำเป็นในเวลาต่าง ๆ เนื่องจากปัญหาความเข้ากันได้

คำตอบนี้เป็นตัวอย่างที่ดีสำหรับวิธีการตั้งค่าต่าง ๆ สำหรับการบำรุงรักษา gcc / g ++ รุ่นต่างๆพร้อมกัน

ทำแบบเดียวกันกับ python2.7 และ python 3.3


2
ผู้ใช้ที่เริ่มต้นอาจไม่สามารถปรับคำตอบที่เชื่อมโยงกับสถานการณ์อื่นได้อย่างง่ายดาย นอกจากการให้เครดิตคำตอบก่อนหน้านี้แล้วมันเป็นการดีที่จะกำหนดขั้นตอนที่จำเป็นสำหรับ Python
chaskes

นี่คือฉันพบวิธีแก้ปัญหาทีละขั้นตอนlinuxconfig.org/
woto

Python 2 และ 3 ไม่ใช่ทางเลือก - แม้แต่รุ่นรองที่แตกต่างกันก็ไม่ใช่ ( เช่น ) วิธีนี้สามารถทำลายสิ่งต่าง ๆ ได้อย่างง่ายดาย
wjandrea

และนี่เป็นคำตอบที่
wjandrea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.