इस प्रश्न से पहले पूछा गया है और अभी भी एक जवाब की कमी है, जहां तक मैं देख सकता हूं। इसलिए मैं इस सवाल का फिर से जवाब देने के लिए इस प्रश्न को फिर से पूछ रहा हूं। (यदि मैं गलत हूं तो कृपया मुझे उत्तर का यूआरएल दें।)उपयोगकर्ता के प्रत्येक चरित्र के लिए तारांकन मुद्रित करने के साथ पाइथन में पासवर्ड इनपुट कैसे किया जा सकता है?
समस्या: प्रोग्रामर उपयोगकर्ता चाहते हैं कि वे पासवर्ड इनपुट करें। गेटपास() फ़ंक्शन इस उद्देश्य के लिए अच्छा है, लेकिन इसके उपयोग में कमी है: पासवर्ड दर्ज करते समय stdout पर मुद्रित नहीं किया गया है।
प्रश्न: कैसे एक getpass() जबकि तारक एक उपयोगकर्ता द्वारा टाइप हर चरित्र के लिए मुद्रित कर रहे हैं लागू किया जा सकता? (बेशक बैकस्पेस - और आदर्श pos1 और अंत - देखभाल के हिसाब से लिया जाना चाहिए।)
प्रेरणा: समुदाय में किया गया है लोगों को समझ नहीं क्यों यह प्रश्न पूछा गया है। और उसके बाद गेटपास() को संदर्भित किया गया है) इस तरह से कार्य को अनदेखा कर रहा है और बी) इस बारे में सोचने के बिना कि संदर्भ प्रश्न का उत्तर नहीं देगा। कारण एसओ शायद उपयोगकर्ताओं की सुविधा के लिए मुद्रित तारांकन करना चाहते हैं: पासवर्ड इनपुट के दौरान उन्हें प्रत्यक्ष दृश्य प्रतिक्रिया मिलती है। इसलिए वे कुंजियों को दबाकर उलझन में नहीं आते हैं - और वहां आंखों के लिए - कुछ भी नहीं हो रहा है।
एक समाधान की दिशा में एक कदम:
मुझे एक समाधान यहाँ दिशा में पहले कदम को पेश करते हैं। वास्तविक समाधान में इसे विकसित करने के लिए कृपया मदद करें।
getch जो stdin से वर्ण दर वर्ण पढ़ने की अनुमति देने के लिए लगता है नाम के एक मॉड्यूल है। बैकस्पेस है - काफी अजीब - 127 के एक पूर्णांक मान पर मैप, लेकिन इस तरह के एक समाधान तो ऐसा दिखाई दे सकता:
def readLineWithAsterisks():
sBuffer = ''
while True:
c = getch.getch()
if c == '\n':
return sBuffer
elif ord(c) == 127:
if len(sBuffer) > 0:
sys.stdout.write('\x08 \x08')
sys.stdout.flush()
sBuffer = sBuffer[0:-1]
continue
else:
sys.stdout.write('*')
sys.stdout.flush()
sBuffer += c
लेकिन इस कोड कुछ कमियां हैं। सबसे पहले मैं सी के बारे में बहुत उलझन में हूं, तो 'b' नहीं होने पर s.o. बैकस्पेस दर्ज किया गया। संभावित हो। इसके लिए एक स्पष्टीकरण है? लिनक्स पर कम से कम ASCII वर्णों को संसाधित किया जाता है। मुझे विंडोज़ के बारे में पता नहीं है, लेकिन अगर ए-जेड 0 9 के अलावा कोई चरित्र दबाया जाता है, तो लाइन सी = getch.getch() एक अपवाद फेंक देगा। getch() कम से कम कुछ हद तक उमलॉट्स और अन्य प्रकार के पात्रों को संसाधित करने में सक्षम प्रतीत नहीं होता है।
समाधान इनपुट के लिए आते हैं निम्नलिखित मुद्दों को संबोधित किया जाना चाहिए:
- कैसे stdin से पठन गैर- ASCII वर्ण के संबंध में वर्ण दर वर्ण किया जा कर सकते हैं?
- प्लेटफ़ॉर्म स्वतंत्र तरीके से यह कैसे किया जा सकता है?
- यह सुरक्षित तरीके से कैसे किया जा सकता है (सुरक्षा समस्याओं के बिना)?(getpass किसी भी तरह इस संबोधित करने के लिए लगता है, लेकिन मैं पूरी तरह से कैसे समझ में नहीं आता।)
हो सकता है कि कोई भी इस बारे में जानता है। मेरे ज्ञान के लिए इस तरह के प्रश्नों से पहले पूछा गया कि अनुत्तरित रहे। लेकिन हो सकता है कि समुदाय में कुछ सॉफ्टवेयर डेवलपर्स इस बारे में और जान सकें और यहां मदद कर सकते हैं? सफलता पर मैं गिटहब पर एक पाइथन मॉड्यूल के रूप में प्रदान किया गया समाधान प्राप्त कर सकता हूं।
"यह बहुत सीधी-सपाट है" - नहीं, नहीं वास्तव में :-) क्षमा करें, लेकिन नहीं हर कोई TTYs और उनके सभी विशेषताओं के बारे में हर विस्तार जानता है :-) - और पढ़ने (1) कि उपयोगी नहीं है : जहां तक मैंने पाइथन में एसटीडीआईएन सीखी है, लाइन द्वारा लाइन को संभाला जाता है। यह मौलिक समस्याओं में से एक है। फिर भी मैं आपके द्वारा दी गई अन्य जानकारी में एक नज़र डालेगा। इनमें से कुछ वास्तव में उपयोगी प्रतीत होता है। आपका बहुत बहुत धन्यवाद! –
एसटीडीआईएन की लाइनवाई हैंडलिंग एक मौलिक पायथन समस्या नहीं है; टीटीई पारंपरिक रूप से लाइन-एडिटिंग क्लाइंट-साइड करने की अनुमति देने के लिए लाइन-बफर किए जाते हैं। साथ ही, पढ़ना (1) बेहद उपयोगी है जब आपको एक बाइट पढ़ने की आवश्यकता होती है। –