come integrare ZSH e (i) pitone?
Domanda
Sono stato innamorato di zsh
per lungo tempo, e più di recente mi è stato scoprire i vantaggi del interprete interattivo ipython
sopra python
stessa. Essere in grado di cd , ls , Esegui o è davvero molto utile. Ma ora ci si sente strano avere una shell come goffo quando in ipython, e mi chiedo come ho potuto integrare la mia e la mia zsh ipython migliore.
Naturalmente, ho potuto riscrivere il mio .zshrc e tutti i miei script in python, e di emulare la maggior parte del mio mondo shell da ipython, ma non mi sembra giusto. E io sono, ovviamente, non pronto per l'uso ipython come un guscio principale comunque.
Quindi, ecco che arriva la mia domanda: come si fa a lavorare in modo efficiente tra il guscio e il vostro python comando-ciclo? Mi sto perdendo un po 'di strategia di integrazione ovvio? Devo fare tutto questo in Emacs?
Soluzione
Ho fatto questa domanda sulla lista zsh e questa risposta lavorato per me. YMMV.
Nel genutils.py dopo la riga
se non di debug:
Rimuovere la riga:
stat = os.system (cmd)
Sostituirlo con:
stat = subprocess.call (cmd shell = True, eseguibile = '/ bin / zsh')
che si vede, il problema è che che "!" chiamata utilizza os.system per eseguirlo, che per default è manky vecchia / bin / sh.
Come ho detto, ha funzionato per me, anche se non sono sicuro di quello che viene però borked dietro le quinte.
Altri suggerimenti
È possibile eseguire comandi di shell da loro a partire con un punto esclamativo e catturare l'output in una variabile pitone. Esempio: vendita di directory nella vostra directory /tmp
:
ipy> import os
ipy> tmplist = !find /tmp
ipy> [dir for dir in tmplist if os.path.isdir(dir)]
L'oggetto lista è un oggetto speciale ipython con diversi metodi utili. Esempio: l'elenco dei file che terminano con .pdf
ipy> tmplist.grep(lambda a: a.endswith('.pdf')) # using a lambda
ipy> tmplist.grep('\.pdf$') # using a regexp
Ci sono un sacco di cose che potete fare leggendo l'elenco dei comandi magici:
ipy> %magic
leggi sezione shell di la documentazione ipython.