2011-08-30 8 views
7

मैं विंडोज़ में कमांड लाइन/टर्मिनल को स्ट्रिंग प्रिंट करना चाहता हूं और फिर स्ट्रिंग को संपादित/बदल सकता हूं और इसे वापस पढ़ सकता हूं। कोई भी जानता है कि यह कैसे करें? धन्यवादपायथन: स्क्रीन पर मुद्रित स्ट्रिंग को संशोधित/संपादित करने और इसे वापस पढ़ने के लिए कैसे करें?

print "Hell" 
Hello! <---Edit it on the screen 
s = raw_input() 
print s 
Hello! 
+6

आम तौर पर बोलते हुए, आप नहीं कर सकते - stdout केवल लिखना है। यदि आप टर्मिनल को म्यूटेबल बफर के रूप में उपयोग करना चाहते हैं, तो प्रत्येक पुनरावृत्ति पर पूरे स्क्रीन को शाप का उपयोग करें या फिर से प्रिंट करें। – delnan

+2

हाँ यदि आप एक गंदे समाधान चाहते हैं तो आप एक कस्टम फ़ाइल-जैसी ऑब्जेक्ट के साथ 'sys.stdout'' को हुक करके पुनः प्रिंट समाधान का प्रयास कर सकते हैं। अन्यथा आपको 'शाप' पुस्तकालय सीखने में कुछ समय बिताना होगा।'' Curses'' के बारे में एक अच्छा ट्यूटोरियल यहां दिया गया है: http://docs.python.org/howto/curses.html –

+0

धन्यवाद। इसलिए ऐसा करने का कोई आसान तरीका नहीं है। शाप विंडोज़ के लिए नहीं है ... – TMS

उत्तर

2

आप ऐसा कुछ एएनएसआई चालबाजी कर सकते हैं जिससे आप स्क्रीन पर संपादन कर रहे हों। Check out this link (this SO post on colors के समान)।

यह केवल कुछ टर्मिनल और कॉन्फ़िगरेशन पर काम करेगा। YMMV।

यह अजगर स्क्रिप्ट Win7 पर मेरे Cygwin टर्मिनल में काम किया:

print 'hell' 
print '\033[1A\033[4CO!' 

एक लाइन पर hellO! मुद्रण ऊपर समाप्त होता है। दूसरा प्रिंट कर्सर को एक पंक्ति (एएससी [1 ए) पर 4 अक्षरों (एएससी [4 सी]) से ऊपर ले जाता है और फिर 'ओ!' प्रिंट करता है।

यह आपको इसे वापस पढ़ने की अनुमति नहीं देगा हालांकि ... केवल 1/2 उत्तर।

0

os.sys.stdout केवल लिखना है, लेकिन आप \b या \r के साथ पूरी लाइन के कुछ पात्रों को मिटा सकते हैं, जब तक आप कैरिज रिटर्न नहीं लिखते।

मैं एक बार कुछ उत्पादन व्यायाम (स्थिति पट्टी सहित) बनाया लिखने के लिए, मिटाने या चेतन अगर आप करेंगे, शायद यह उपयोगी है (हालांकि, यह भी मानक अजगर सांत्वना/टर्मिनल के लिए सीमाओं के बारे में my question देखें) :

from __future__ import print_function 
import sys, time 

# status generator 
def range_with_status(total): 
    n=0 
    while n<total: 
     done = '#'*(n+1) 
     todo = '-'*(total-n-1) 
     s = '<{0}>'.format(done+todo) 
     if not todo: 
      s+='\n' 
     if n>0: 
      s = '\r'+s 
     sys.stdout.write(s) 
     sys.stdout.flush() 
     yield n 
     n+=1 

print ('doing something ...') 
for i in range_with_status(10): 
    time.sleep(0.1) 

print('ready') 
time.sleep(0.4) 


print ('And now for something completely different ...') 
time.sleep(0.5) 
msg = 'I am going to erase this line from the console window.' 
sys.stdout.write(msg); sys.stdout.flush() 
time.sleep(1) 
sys.stdout.write('\r' + ' '*len(msg)) 
sys.stdout.flush() 
time.sleep(0.5) 
print('\rdid I succeed?') 
time.sleep(4) 
0

raw_input, एक "शीघ्र संदेश" के लिए एक पैरामीटर स्वीकार करता है तो उत्पादन संदेश है कि का उपयोग करें, और उसके बाद क्या आप वापस पाने के लिए यह पहले जोड़ें। हालांकि, यह आपको प्रॉम्प्ट में बैकस्पेस करने की अनुमति नहीं देगा, क्योंकि यह एक संकेत है और वास्तव में इनपुट का हिस्सा नहीं है।

s = "Hell" + raw_input("Hell") 
print s 
0

अगर यह अपने खुद के प्रयोजनों के लिए है, तो यहाँ एक गंदा सुबह क्लिपबोर्ड का उपयोग करके हैक खोने से पहले क्या था बिना है:

def edit_text_at_terminal(text_to_edit): 
    import pyperclip 

    # Save old clipboard contents so user doesn't lose them 
    old_clipboard_contents = pyperclip.paste() 

    #place text you want to edit in the clipboard 
    pyperclip.copy(text_to_edit) 

    # If you're on Windows, and ctrl+v works, you can do this: 
    import win32com.client 
    shell = win32com.client.Dispatch("WScript.Shell") 
    shell.SendKeys("^v") 

    # Otherwise you should tell the user to type ctrl+v 
    msg = "Type ctrl+v (your old clipboard contents will be restored):\n" 

    # Get the new value, the old value will have been pasted 
    new_value= str(raw_input(msg)) 

    # restore the old clipboard contents before returning new value 
    pyperclip.copy(old_clipboard_contents) 
    return new_value 

ध्यान दें कि Ctrl + V सभी टर्मिनलों में काम नहीं करता, विशेष रूप से विंडोज डिफ़ॉल्ट (ways to make it work हैं, हालांकि मैं इसके बजाय ConEmu का उपयोग करने की अनुशंसा करता हूं)।

अन्य ओएस के लिए कीस्ट्रोक स्वचालित करने से एक अलग प्रक्रिया शामिल होगी।

कृपया याद रखें कि यह एक त्वरित हैक है और "उचित" समाधान नहीं है। क्षणिक रूप से आपके क्लिपबोर्ड पर संग्रहीत पूरे पीएचडी शोध प्रबंधों के नुकसान के लिए मुझे ज़िम्मेदार नहीं ठहराया जाएगा।

उचित समाधान के लिए लिनक्स के लिए curses जैसे बेहतर दृष्टिकोण हैं, और विंडोज़ पर AutHotKey (शायद एक इनपुट बॉक्स फेंक दें, या कुछ कीस्ट्रोक/क्लिपबोर्ड जादूगर) देखें।

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

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