2011-08-30 18 views
7

Windowsのコマンドライン/ターミナルに文字列を出力してから、その文字列を編集/変更して読み返したいと思います。誰でもその方法を知っていますか?ありがとうPython:スクリーンに印刷された文字列を修正/編集する方法

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

一般的に言えば、stdoutは書き込み専用です。あなたが可変バッファとしてターミナルを使いたいなら、cursesを使うか、すべての繰り返しごとにスクリーン全体を再印刷してください。 – delnan

+2

厄介な解決策が必要な場合は、カスタムファイルライクなオブジェクトで '' sys.stdout''をフックすることで、再印刷ソリューションを試すことができます。さもなければ、 '' curses''ライブラリの学習に時間を費やさなければなりません。'' curses''についての素敵なチュートリアルです:http://docs.python.org/howto/curses.html –

+0

ありがとうございました。これを行う簡単な方法はありません。 cursesは途中でWindows用ではありません... – TMS

答えて

2

あなたは画面上で編集しているように見えるようにANSIトリッキーを行うことができます。 Check out this link(これもthis SO post on colorsと同様)。

これは特定の端末と構成でのみ機能します。 ymmv。

このPythonスクリプトは、win7の上で私のCygwinターミナルで働いていた:

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

は、1行にhellO!を印刷してしまいます。 2回目の印刷では、カーソルを1行上に移動させ(Esc [1A])、その後4文字(Esc [4C])を超えた後、 'O!'を印刷します。

でも、1/2答えですがそれを読んでもらえませんでした。

0

os.sys.stdoutは書き込み専用ですが、キャリッジリターンを書いていない限り、\bまたは最後の行の一部の文字を\rで消去することができます。

(ただし、標準のPythonコンソール/端末にも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は、「プロンプトメッセージ」のパラメータを受け付けますので、出力メッセージにそれを使用して、あなたが戻って得るものにそれを付加。しかし、プロンプトであり、入力の一部ではないため、プロンプトにバックスペースすることはできません。 、CTRL + vはすべての端末では動作しないこと

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 

注:それはあなた自身の目的のためなら

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

は、その後、ここで前にそこにあったものを失うことなく、クリップボードを使用して汚いおしっこハック特にWindowsのデフォルト(ways to make it workがありますが、代わりにConEmuを使用することをお勧めします)。

他のOSのキーストロークを自動化するには、別のプロセスが必要です。

これは簡単な解決策であり、「適切な」解決策ではありません。私はあなたのクリップボードに一時的に保存されている博士論文全体の喪失に責任を負いません。

Linuxの場合はcursesなどのより良いアプローチがあり、Windowsの場合はAutHotKey(おそらく入力ボックスを投げたり、キーストローク/クリップボードウィザードを行うなど)を調べる価値があります。

関連する問題