Historique persistant de la ligne de commande Python
Je voudrais être en mesure de "flèche haut" pour les commandes que j'ai entrée dans un précédent de l'interpréteur Python. J'ai trouvé le readline
module qui offre des fonctions comme: read_history_file
write_history_file
et set_startup_hook
. Je ne suis pas tout à fait suffisamment malin pour mettre cela en pratique, cependant, si quelqu'un pourrait s'il vous plaît aider? Mes pensées sur la solution sont:
(1) Modifier .connexion PYTHONSTARTUP pour exécuter un script python.
(2) Dans ce script python fichier faire quelque chose comme:
def command_history_hook():
import readline
readline.read_history_file('.python_history')
command_history_hook()
(3) Chaque fois que l'interprète de sorties, d'écrire l'histoire dans le fichier. Je suppose que la meilleure façon de le faire est de définir une fonction dans votre script de démarrage et de sortie à l'aide de cette fonction:
def ex():
import readline
readline.write_history_file('.python_history')
exit()
C'est très ennuyeux d'avoir à quitter l'aide de parenthèses, si: ex()
. Est-il un python de sucre qui permettrait ex
(sans les parenthèses) pour exécuter le ex
fonction?
Est-il un meilleur moyen pour que le fichier de l'historique d'écrire à chaque fois? Merci d'avance pour toutes les solutions/suggestions.
Aussi, il y a deux choix architecturaux que je peux voir. Un seul choix est d'avoir un commandement unifié de l'histoire. L'avantage est la simplicité (l'alternative qui suit portées à votre répertoire d'accueil avec un lot de fichiers.) L'inconvénient est que les interprètes vous courez dans des bornes séparées seront remplis avec les uns des autres de commande d'histoires, et elles remplacent l'un l'autre de l'histoire. (ce n'est pas grave pour moi car d'habitude je suis intéressé par la fermeture d'un interprète et la réouverture de l'un immédiatement pour recharger les modules, et dans ce cas, qui interprète les commandes ont été écrites dans le fichier.) Une solution possible de séparer les fichiers d'historique par terminal est d'écrire une variable d'environnement pour chaque nouveau terminal à vous de créer:
def random_key()
''.join([choice(string.uppercase + string.digits) for i in range(16)])
def command_history_hook():
import readline
key = get_env_variable('command_history_key')
if key:
readline.read_history_file('.python_history_{0}'.format(key))
else:
set_env_variable('command_history_key', random_key())
def ex():
import readline
key = get_env_variable('command_history_key')
if not key:
set_env_variable('command_history_key', random_key())
readline.write_history_file('.python_history_{0}'.format(key))
exit()
Par la diminution de l'aléatoire de la longueur de la clé de 16 à dire 1 vous pouvez diminuer le nombre de fichiers qui jonchent votre répertoires à 36 au détriment des possibles (2.8% de chance) de chevauchement.
source d'informationauteur Carl G
Vous devez vous connecter pour publier un commentaire.
Je pense que les suggestions contenues dans la documentation Python couvrir à peu près ce que vous voulez. Regardez l'exemple pystartup fichier vers la fin de l'article 13.3:
ou voir cette page:
Mais, pour la sortie de la boîte de shell interactif qui fournit tout cela et bien plus, jetez un oeil à l'aide de IPython:
Essayez d'utiliser IPython comme un python shell. Il a déjà tout ce que vous demandez. Ils ont des paquets pour la plus populaire des distributions, donc installer devrait être très facile.
Persistante de l'histoire a été pris en charge hors de la boîte depuis Python 3.4. Voir ce rapport de bug.
Utiliser PIP pour installer le pyreadline package:
Si tout ce que vous voulez, c'est pour une utilisation interactive de l'histoire de la substitution sans toutes les choses, tout ce que vous devez faire est d'importer readline:
Et vous pouvez alors utiliser les touches haut/bas pour naviguer passé des commandes. Même pour 2 ou 3.
Ce n'était pas clair pour moi de la documentation, mais peut-être que je l'ai raté.