как интегрировать ZSH и (i) python?

Я давно влюбляюсь в zsh , и совсем недавно я обнаружил преимущества интерактивного интерпретатора ipython над самим python . Быть в состоянии cd , ls , запускать или до ! действительно очень удобно. Но теперь кажется странным иметь такую ​​неуклюжую оболочку, когда в ipython, и мне интересно, как лучше интегрировать мой zsh и мой ipython.

Конечно, я мог бы переписать мой .zshrc и все мои скрипты в python и эмулировать большую часть моего мира оболочки из ipython, но это не кажется правильным. И я, очевидно, не готов использовать ipython как основную оболочку.

Итак, вот мой вопрос: как вы эффективно работаете между вашей оболочкой и вашим командным циклом python? Не хватает ли я какой-то очевидной стратегии интеграции? Должен ли я делать все это в emacs?

Я задал этот вопрос в списке zsh, и этот ответ сработал для меня. YMMV.

В genutils.py после строки

если не отлаживать:

Удалите строку:

stat = os.system (cmd)

Замените его:

stat = subprocess.call (cmd, shell = True, executable = '/ bin / zsh')

вы видите, проблема в том, что это! call использует os.system для запуска, который по умолчанию используется для manky old / bin / sh.

Как я уже сказал, это сработало для меня, хотя я не уверен, что зарывалось за кулисами.

Вы можете запускать команды оболочки, запуская их с восклицательным знаком и захватывая вывод в переменной python. Пример: перечисление каталогов в каталоге /tmp :

 ipy> import os ipy> tmplist = !find /tmp ipy> [dir for dir in tmplist if os.path.isdir(dir)] 

Объект list – это специальный объект ipython с несколькими полезными методами. Пример: список файлов, заканчивающихся на .pdf

 ipy> tmplist.grep(lambda a: a.endswith('.pdf')) # using a lambda ipy> tmplist.grep('\.pdf$') # using a regexp 

Вы можете многое сделать, читая список магических команд:

 ipy> %magic 

См. Раздел оболочки в документации Ipython.