ออกจากบรรทัดคำสั่งของหลาม


152

ในการออกจากบรรทัดคำสั่ง Python ฉันต้องพิมพ์ exit () ถ้าฉันพิมพ์ exit ก็จะบอกว่า

Use exit() or Ctrl-Z plus Return to exit

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


มันอาจจะเกี่ยวข้องกับวิธีการที่ฟังก์ชั่นมักจะถูกเรียกด้วย()ณ สิ้น ... มิฉะนั้นมันอาจจะเป็นตัวแปร ... หรือวัตถุบางชนิด ...
ซัมเมอร์

ถูกต้อง แต่ล่ามรู้ว่าฉันกำลังพยายามออกและนั่นเป็นเหตุผลที่พิมพ์ข้อความนั้น มิฉะนั้นจะพิมพ์ข้อความแสดงข้อผิดพลาด หากรู้ว่าฉันกำลังพยายามออกมันก็สามารถออกได้
Ank

1
exit หรือ exit () พ่นข้อผิดพลาดให้ฉันประมาณ 20% ของการติดตั้งที่ฉันพบในโลก ... มีเพียง CTRL + Z + ที่ใช้งานได้กลับมาอย่างสม่ำเสมอ
เปาโล Carvalho

คำตอบ:


37

ในหลามของฉันล่ามexitเป็นจริงสตริงและไม่ได้ฟังก์ชั่น 'Use Ctrl-D (i.e. EOF) to exit.'- คุณสามารถตรวจสอบล่ามของคุณโดยการป้อนtype(exit)

ในงูหลามที่ใช้งานสิ่งที่เกิดขึ้นคือทางออกคือฟังก์ชั่น หากคุณไม่เรียกใช้ฟังก์ชันมันจะพิมพ์การแทนค่าสตริงของวัตถุ นี่เป็นพฤติกรรมเริ่มต้นสำหรับวัตถุใด ๆ ที่ส่งคืน เป็นเพียงการที่นักออกแบบคิดว่าผู้คนอาจลองพิมพ์ exit เพื่อออกจากล่ามดังนั้นพวกเขาจึงทำให้การแสดงสตริงของฟังก์ชัน exit เป็นข้อความที่มีประโยชน์ คุณสามารถตรวจสอบพฤติกรรมนี้โดยการพิมพ์หรือแม้กระทั่งstr(exit)print exit


14
Ctrl-Z คือสิ่งที่คุณทำบน Windows (ดีดอส) ที่คุณจะทำ Ctrl-D บนระบบที่เหมือน Unix
Karl Knechtel

@KarlKnechtel อ่ารู้ดี ฉันมีประสบการณ์การเขียนโปรแกรมบน windows เล็กน้อย
Dunes

60

วิธีนี้ใช้ได้ผลสำหรับฉันวิธีที่ดีที่สุดในการออกจากพรอมต์หลาม

ออก ()


4
ฉันสับสนเกี่ยวกับคำตอบนี้ ... คำถามตัวเองบอกว่าพวกเขารู้แล้วว่าexit()ทำงานได้ดีและพวกเขาต้องการทราบว่าทำไมexitไม่มีการเลียนแบบไม่ได้ผล ดังนั้นคำตอบนี้จะทำซ้ำส่วนหนึ่งของคำถามและไม่ตอบคำถามจริงๆ
Ben Lee

ฉันอยากจะลงคะแนนคำตอบนี้โดยไม่อ่านคำถาม แต่ฉันคิดว่าการติดตั้งไพ ธ อนส่วนใหญ่จะถูกต้อง เป็นเพียงที่ผู้ใช้บอกว่าสิ่งนี้ไม่ทำงานในกรณีของพวกเขาดังนั้นแนะนำให้ดูเหมือนว่า ... ไม่เหมาะสม
person27

37

เมื่อคุณพิมพ์exitในบรรทัดคำสั่งมันจะค้นหาตัวแปรที่มีชื่อและการเรียก__repr__(หรือ__str__) บนมัน โดยปกติแล้วคุณจะได้รับผลลัพธ์เช่น:

<function exit at 0x00B97FB0>

แต่พวกเขาตัดสินใจที่จะกำหนดฟังก์ชันexitนั้นอีกครั้งเพื่อให้วัตถุแสดงข้อความที่เป็นประโยชน์แทน ไม่ว่าจะเป็นพฤติกรรมโง่หรือไม่เป็นคำถามอัตนัย แต่เหตุผลหนึ่งที่เป็นไปได้ว่าทำไมมันไม่ "เพียงแค่ออก" คือ:

สมมติว่าคุณกำลังดูโค้ดบางอย่างในดีบักเกอร์และหนึ่งในวัตถุที่อ้างอิงexitฟังก์ชัน เมื่อดีบักเกอร์พยายามโทรหา__repr__วัตถุนั้นเพื่อแสดงฟังก์ชั่นนั้นกับคุณโปรแกรมก็หยุดทันที! นั่นเป็นสิ่งที่คาดไม่ถึงจริง ๆ และมาตรการในการตอบโต้ที่อาจทำให้สิ่งต่าง ๆ ซับซ้อนมากขึ้น (ตัวอย่างเช่นแม้ว่าคุณจะ จำกัด พฤติกรรมนั้นไว้ที่บรรทัดคำสั่งจะทำอย่างไรถ้าคุณพยายามพิมพ์วัตถุบางอย่างที่มีexitแอตทริบิวต์เป็น)


4
ในกรณีนี้ฟังก์ชั่นออกจริงไม่ได้อยู่ในขอบเขตเว้นแต่import sysคุณจะโทรหา sys.exit () เพื่อออกจากล่าม
Michael Dillon

19

ข้อความนี้เป็น__str__คุณสมบัติของexit

ดูตัวอย่างเหล่านี้:

1

>>> print exit
Use exit() or Ctrl-D (i.e. EOF) to exit

2

>>> exit.__str__()
'Use exit() or Ctrl-D (i.e. EOF) to exit'

3

>>> getattr(exit, '__str__')()
'Use exit() or Ctrl-D (i.e. EOF) to exit'

19

Ctrl-Dผมขอแนะนำให้คุณออกจากล่ามหลามกับ นี่คือรหัส ASCII เก่าสำหรับการสิ้นสุดการส่งไฟล์หรือสิ้นสุดการส่ง


ดูเหมือนว่าวิธีนี้จะไม่ทำงานหากสคริปต์พบข้อผิดพลาด
blaylockbk

2
Ctrl-Breakทำงานอย่างต่อเนื่องใน Windows Ctrl-DหรือCtrl-Zทำงานใน Windows สำหรับ Python 2.7, 3.4, 3.6 แต่ในหลาม 3.7 เหล่านี้หยุดทำงานและลำดับ ASCII Ctrl-Z Enterที่สั้นที่สุดที่ออกคือ
Bob Stein

14

ด้วย Anaconda 4.5+ และ Python 3.6+ สำหรับการใช้งาน Windows

Ctrl+Z

หรือ

exit()

ในบางกรณีคุณอาจต้องใช้

Ctrl+Break

หากคอมพิวเตอร์ของคุณไม่ได้มีความBreakสำคัญแล้วดูที่นี่


8

เนื่องจากล่ามไม่ใช่เชลล์ที่คุณให้คำสั่งมันคือ - ดี - ล่าม สิ่งที่คุณมอบให้คือรหัสหลาม

ไวยากรณ์ของ Python exitนั้นไม่สามารถเป็นชื่ออื่นสำหรับวัตถุได้ การอ้างถึงวัตถุนั้นไม่สามารถทำอะไรได้เลยจริงๆ (ยกเว้นสิ่งที่ลูป read-eval-print ปกติทำเช่นการแสดงการแสดงสตริงของวัตถุ)


6

คุณสามารถแก้ไขได้

ลิงก์PYTHONSTARTUPไปยังไฟล์ python ดังต่อไปนี้

# Make exit work as expected
type(exit).__repr__ = type(exit).__call__

มันทำงานอย่างไร

บรรทัดคำสั่ง python เป็น read-assess-print-loop ซึ่งก็คือเมื่อคุณพิมพ์ข้อความมันจะอ่านข้อความนั้นประเมินมันและพิมพ์ผลลัพธ์ในที่สุด

เมื่อคุณพิมพ์exit()มันประเมินเป็นวัตถุชนิดที่site.Quitterเรียกได้และเรียกใช้__call__ฟังก์ชั่นซึ่งออกจากระบบ เมื่อคุณพิมพ์exitมันประเมินเป็นวัตถุ callable เดียวกันโดยไม่ต้องเรียกมันวัตถุจะถูกพิมพ์ซึ่งจะเปิดสาย__repr__บนวัตถุ

เราสามารถใช้ประโยชน์จากนี้โดยการเชื่อมโยง__repr__ไป__call__และทำให้ได้รับพฤติกรรมที่คาดหวังของการออกจากระบบได้เมื่อเราพิมพ์exitโดยไม่ต้องวงเล็บ


4
พวกเขาพยายามexitพิมพ์สตริงที่ "มีประโยชน์" แต่พวกเขาไม่สามารถผูกมันเพื่อทำสิ่งที่เป็นธรรมชาติและออกจากล่าม ถูกบังคับให้พิมพ์วงเล็บทุกครั้งที่น่าผิดหวัง คำตอบนี้สมบูรณ์แบบและควรเป็นคำตอบที่ยอมรับได้แทน
Przemek D

3

หากต้องการออกจากเทอร์มินัล Pythonเพียงทำ:

exit()

โปรดใส่ใจมันเป็นฟังก์ชั่นที่เรียกว่าผู้ใช้ส่วนใหญ่ผสมกับทางออกโดยไม่ต้องโทร แต่เทอร์มินัล Pyhton ใหม่แสดงข้อความ ...

หรือเป็นทางลัดให้กด:

Ctrl + D

บนแป้นพิมพ์ของคุณ ...

ctrl + D


1
ทุกสิ่งที่คุณพูดถูกกล่าวถึงในคำตอบข้างต้นแล้ว
Przemek D

0

หากคุณติดอยู่ในบรรทัดคำสั่ง python และไม่มีวิธีแก้ไขปัญหาใดที่ใช้ได้ผลสำหรับคุณลอง exit(2)


-1

"exit" เป็นชื่อตัวแปรที่ถูกต้องที่สามารถใช้ในโปรแกรม Python ของคุณ คุณไม่ต้องการออกจากล่ามเมื่อคุณแค่พยายามดูค่าของตัวแปรนั้น


ยกเว้นถ้าคุณมอบหมายให้exitคุณลบล้างสัญลักษณ์นี้และexit()จะไม่ทำงานอีกต่อไป แม้ว่าสัญลักษณ์นี้จะเป็นชื่อตัวแปรที่ถูกต้อง แต่การใช้สัญลักษณ์ในลักษณะนี้ดูเหมือนจะไม่เป็นวิธีที่ดีนัก
Przemek D
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.