मैंने cmd मॉड्यूल का उपयोग करके एक पायथन 3.5 एप्लिकेशन लिखा था। आखिरी चीज जिसे मैं कार्यान्वित करना चाहता हूं वह सीटीआरएल-सी (सिग्ंट) सिग्नल का उचित संचालन है।पायथन सीएमडी मॉड्यूल में CTRL-C संभाल
- प्रिंट^सी बिंदु पर कर्सर
- स्पष्ट बफर है ताकि इनपुट पाठ
- हटा दी जाती है अगले पर जाएं: मैं इसे कम या ज्यादा व्यवहार करने के लिए जिस तरह से बैश यह करता है चाहते हैं लाइन, शीघ्र प्रिंट, और
मूल रूप से इनपुट के लिए प्रतीक्षा:
/test $ bla bla bla|
# user types CTRL-C
/test $ bla bla bla^C
/test $
यहाँ एक runnable के रूप में कोड सरल है नमूना:
import cmd
import signal
class TestShell(cmd.Cmd):
def __init__(self):
super().__init__()
self.prompt = '$ '
signal.signal(signal.SIGINT, handler=self._ctrl_c_handler)
self._interrupted = False
def _ctrl_c_handler(self, signal, frame):
print('^C')
self._interrupted = True
def precmd(self, line):
if self._interrupted:
self._interrupted = False
return ''
if line == 'EOF':
return 'exit'
return line
def emptyline(self):
pass
def do_exit(self, line):
return True
TestShell().cmdloop()
यह लगभग काम करता है। जब मैं CTRL-C दबाता हूं,^सी कर्सर पर मुद्रित होता है, लेकिन मुझे अभी भी एंटर दबा देना है। फिर, precmd
विधि हैंडलर द्वारा सेट किए गए self._interrupted
ध्वज को नोटिस करती है, और एक खाली रेखा लौटाती है। यह वह जगह है जहां तक मैं इसे ले सकता हूं, लेकिन मैं किसी भी तरह से उस प्रविष्टि को दबा नहीं देना चाहता हूं।
मुझे लगता है कि मुझे किसी भी तरह से input()
को वापस करने की आवश्यकता है, क्या किसी के पास विचार हैं?
यह एक छोटा सा चलने योग्य नमूना रखने में मदद करेगा। अपने कोड को चलाने के बिना आप वर्तमान में इसके बारे में कैसे जा रहे हैं, ''\ n'' या खाली' stdout' 'पर रिक्त लिखेंगे? सिग्नल हैंडलर को एक बार '' सी ' – tijko
@tijko के अंत में एक नई लाइन का सामना करना पड़ता है, स्निपेट को एक चलने योग्य नमूने के साथ बदलकर पोस्ट संपादित किया जाता है। मैंने stdout के लिए एक नई लाइन लिखने की कोशिश की (यह वास्तव में प्रिंट विधि द्वारा डिफ़ॉल्ट रूप से किया जाता है), लेकिन यह काम नहीं करता है, और यह क्यों होगा? यह stdout से stdin खिलाया जाना चाहिए, जो मामला नहीं है, यह पाइप नहीं है। – wujek
हाँ, आप सही हैं मैं कमांड लाइन stdin प्रॉम्प्ट के मामले में नहीं सोच रहा था। @ डैनगेटज़ का एक उत्तर है जो आपकी आवश्यकताओं के अनुरूप होगा। इसके क्लीनर भी, सिग्नल हैंडलर सेट या सेट झंडे सेट करने की जरूरत नहीं है। आपकी टिप्पणी के बाद मैंने स्टडीन को रीडायरेक्ट करने की लाइनों के साथ सोचना शुरू कर दिया, लेकिन आपको आवश्यकता होने पर समायोजित कर सकते हैं। – tijko