अजगर को ctrl-D पर छोड़ने से रोकें


0

मुझे लगता है कि निम्नलिखित अक्सर मेरे साथ होता है:

  1. मैं एक इंटरैक्टिव टर्मिनल सत्र में पायथन का उपयोग कर रहा हूं
  2. मैं गलती से असंतुलित कोष्ठक के साथ कुछ टाइप करता हूं
  3. अजगर मुझे ए ... शीघ्र, मुझे कोड की दूसरी पंक्ति दर्ज करने की उम्मीद है
  4. पायथन कमांड प्रॉम्प्ट पर वापस जाने के प्रयास में, मैं सहज रूप से टाइप करता हूं ctrl-D (ट्रांसमिशन कैरेक्टर का अंत)
  5. वापस बाहर निकलने के बजाय >>> शीघ्र, पायथन प्रक्रिया तुरंत समाप्त हो जाती है, मेरे इंटरैक्टिव सत्र से सभी डेटा खो देते हैं

मैं चाहूंगा कि यह और न हो। इसलिए मेरे प्रश्न हैं:

  • क्या पायथन को छोड़ने से रोकने का कोई तरीका है ctrl-D दबाया जाता है ;;

  • यह इच्छाधारी सोच हो सकती है, लेकिन क्या कोई ऐसा तरीका है जो मैं बना सकता हूं ctrl-D मुझे पायथन प्रॉम्प्ट पर वापस ले जाएं क्योंकि मैं इसे करने की उम्मीद रखता हूं

मैं Mac पर MacPorts के साथ इंस्टॉल किए गए Python 3.6 का उपयोग करता हूं, लेकिन मुझे लगता है कि यह एक काफी प्लेटफ़ॉर्म-स्वतंत्र प्रश्न है। मेरा मानना ​​है कि यह इंस्टॉलेशन प्रासंगिक होने की स्थिति में उपयोगकर्ता इंटरैक्शन के लिए Gnu Readline लाइब्रेरी का उपयोग करता है।

जवाबों:


0

बुनियादी कार्यक्रमों में जो 'पकाया' मोड का उपयोग करते हैं, जैसे कि cat, Ctrl + D के रूप में tty परत पर झुका है EOF चरित्र - इसे सीधे प्रक्रिया में नहीं भेजा जाता है, लेकिन एक 'EOF' स्थिति उत्पन्न करता है, जिससे प्रक्रिया को अचानक इसके द्वारा 0-बाय-परिणाम प्राप्त होता है read(stdin) कहते हैं। (प्रक्रिया सिर्फ स्थिति को नोट कर सकती है और हालांकि जारी रख सकती है।)

सिद्धांत रूप में, क्योंकि पायथन रीडलाइन का उपयोग करता है, यह इससे प्रभावित नहीं होता है; यह टर्मिनल को 'क्रैक' मोड में उपयोग करता है और रीडलाइन को Ctrl + D सहित सभी विशेष वर्णों को संभालने की सुविधा देता है। (यह है, कुंजी दबाने से "\ x04" रीड से वापस आ जाएगा, जिसे तब रीडिंग बाइंडिंग द्वारा आंतरिक रूप से नियंत्रित किया जाता है।)

हालाँकि, रीडलाइन स्वचालित रूप से उसी नियंत्रण वर्णों को बांधती है, जिसे वह पहले से ही सीमित परत पर देखता है, और पायथन के भीतर से इसे नियंत्रित करने का कोई विकल्प नहीं है। (हालांकि इसमें एक ~ / .inputrc विकल्प है, यह पायथन के भीतर अनदेखा किया गया लगता है।)

जब ctrl-D दबाया जाता है तो पायथन को छोड़ने से रोकने का एक तरीका है ;;

तो ऐसा लगता है कि पायथन की रीडलाइन को Ctrl + D से EOF मानने से रोकने का कोई तरीका नहीं है जब तक tty लेयर है EOF कुछ और करने के लिए बाध्य (लेकिन पूरी तरह से अनबाउंड नहीं)। आपका एकमात्र विकल्प है TOF परत पर Ctrl + D के अलावा कुछ और होने के लिए EOF वर्ण को फिर से परिभाषित करना (उपयोग करना) stty eof ), और इसे बाहर निकलने पर सही मूल्य पर फिर से परिभाषित करें।

इसे अपनी $ PYTHONSTARTUP फ़ाइल में डालने का प्रयास करें:

if True:
    import atexit, os
    os.system("stty eof ^X")
    atexit.register(lambda: os.system("stty eof ^D"))

(ध्यान दें कि पूरी तरह से अपरिभाषित eof यहां काम नहीं करेगा - यदि रीडलाइन शून्य लगती है, तो यह डिफ़ॉल्ट रूप से Ctrl + D मान लेगा।)

उपरोक्त स्वतंत्र रूप से, यदि मैं एक बेमेल कोष्ठक टाइप करता हूं, तो उसे छोड़ने का सही तरीका क्या है ... शीघ्र और वापस पाने के लिए >>> मेरे द्वारा दर्ज किए गए कोड को चलाने के बिना एक?

दबाएँ Ctrl + C । पायथन ने ऐसा करने के लिए SIGINT को स्वीकार किया, जैसा कि ज्यादातर गोले करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.