Мне было интересно, есть ли способ «имитировать» linux .bash_history. Это было бы примерно так:
def write_history(cmd):
try:
with open("/root/.python_history","a") as history:
history.write(str(cmd) + "\n")
history.close()
except:
with open("/root/.python_history","w") as history:
history.write(str(cmd) + "\n")
history.close()
while 1:
cmd = raw_input("cmd > ")
write_history(cmd)
if cmd.lower() == "exit":
exit()
elif cmd.lower() == "yay":
print("YAY !")
elif keyup.is.pressed: #it's to do this that I need help
read_the_last_line_of_python_history() #and this too
Вы можете мне помочь, пожалуйста? Спасибо.






Используйте модуль cmd для оболочки и readline для истории:
import cmd
import sys
import os.path
import readline
histfn = os.path.expanduser('~/.mycmd.history')
class MyCmd(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
try:
readline.read_history_file(histfn)
except IOError:
pass
def do_yay(self, arg):
print('YAY !')
def do_exit(self, arg):
readline.write_history_file(histfn)
sys.exit(0)
def do_EOF(self, arg):
print()
self.do_exit(arg)
if __name__ == '__main__':
MyCmd().cmdloop()
Модуль cmd - это стандартный модуль в из стандартной библиотеки для этой цели. Следовательно, вы должны его использовать. Он поддерживает все функции чтения строки, которые ожидают продвинутые пользователи, включая поиск в прошлых командах и тому подобное. Невозможно получить нажатие клавиш с помощью raw_input, это просто неподходящий инструмент для работы. В любом случае добавить в вашу программу функциональность readline будет на порядки сложнее, чем запустить простой поиск и замену для преобразования вашего if-дерева в методы do_ *.
спасибо, он работает, но проблема в том, что написан сценарий на 300 строк, и для того, чтобы сделать это по-вашему, мне пришлось бы переписать весь сценарий. Есть ли способ попроще, как я написал в верхнем сообщении?