2016-12-29 9 views
5

मैं अपने पाइथन प्रोग्राम को पाइप से इनपुट लेना चाहता हूं और बाद में टर्मिनल से इनपुट लेना चाहता हूं। this एसओ पोस्ट पढ़ने के बाद, मैंने sys.stdin को प्रतिस्थापित करने के लिए/dev/tty खोलने का प्रयास किया।पायथन: जब sys.stdin का मान बदल दिया गया है तो मैं जीएनयू रीडलाइन का उपयोग कैसे कर सकता हूं?

import sys 
import readline 

def tty_input(prompt): 
    with open("/dev/tty") as terminal: 
     sys.stdin = terminal 
     user_input = input(prompt) 
    sys.stdin = sys.__stdin__ 
    return user_input 

इस दृष्टिकोण के साथ समस्या यह है कि जीएनयू ReadLine जब sys.stdin! = Sys .__ stdin__ काम नहीं करता है। मैं कर्सर को स्थानांतरित करने या इतिहास को नेविगेट करने के लिए तीर कुंजियों का उपयोग नहीं कर सकता। मैंने इस मुद्दे के लिए एक पैच पढ़ा है जिसे here सबमिट किया गया था, लेकिन मुझे लगता है कि इसमें कुछ भी नहीं आया है।

यदि sys.stdin के मान को बदले बिना पाइप और टर्मिनल दोनों से इनपुट स्वीकार करने का कोई तरीका है, तो मैं सुझावों के लिए खुला हूं।

+0

भी देखें इस बग रिपोर्ट: http://bugs.python.org/msg286521 – src

उत्तर

0

मुझे लगता है कि sys.stdin और sys.__stdin__ आपको नहीं लगता कि वे क्या हैं। मैं इसे पुन: असाइन करने से पहले मूल sys.stdin को सेव कर दूंगा।

import sys 
import readline 

def tty_input(prompt): 
    oldStdin = sys.stdin 
    with open("/dev/tty") as terminal: 
     sys.stdin = terminal 
     user_input = input(prompt) 
    sys.stdin = oldStdin 
    return user_input 

या यह सुनिश्चित करने एक प्रति

import sys 
import readline 
import copy 

def tty_input(prompt): 
    oldStdin = copy.copy(sys.stdin) 
    with open("/dev/tty") as terminal: 
     sys.stdin = terminal 
     user_input = input(prompt) 
    sys.stdin = oldStdin 
    return user_input 
संबंधित मुद्दे

 संबंधित मुद्दे