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

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

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

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


person Gyom    schedule 10.06.2009    source источник


Ответы (2)


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

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

если не отладка:

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

stat = os.system (cmd)

Замените на:

stat = subprocess.call (cmd, shell = True, исполняемый файл = '/ bin / zsh')

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

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

person chiggsy    schedule 01.07.2009
comment
да, это действительно меняет оболочку для zsh; но мой .zshrc все еще не читается, и я не получаю свои псевдонимы / функции. ты ? - person Gyom; 02.07.2009
comment
.zshrc читается только в интерактивной оболочке. / bin / zsh -i - это то, как вы заставляете zsh работать в интерактивном режиме, читая .zshrc. Хотел бы я знать об этом в прошлом году. - person chiggsy; 07.05.2010
comment
Все, что относится к неинтерактивным оболочкам, следует просто использовать в формате .zshenv вместо .zshrc, а не использовать zsh -i. .zshrc следует использовать для таких вещей, как подсказки. - person weronika; 03.05.2012
comment
Вы также можете использовать переменную среды $ SHELL, я думаю, это безопаснее, чем жесткое программирование пути исполняемого файла оболочки: import os, stat = subprocess.call(cmd,shell=True,executable=os.environ['SHELL']) - person leifdenby; 04.12.2012
comment
@liefdenby Ваш ответ гласит: «Так надо делать!» Будем молиться, чтобы это было так. - person chiggsy; 06.12.2012
comment
Где genutils.py? Я делаю find / -name genutils.py 2> /dev/null и ничего не получаю на моей машине ubuntu с установленным IPython. - person Frozen Flame; 19.08.2015

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

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

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

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

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

ipy> %magic

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

person Toni    schedule 10.06.2009
comment
да, спасибо, я понял это, мой вопрос был скорее опытным пользователем (даже если я еще не считаю себя опытным пользователем ipython). Например, меня очень раздражает, что этот синтаксис восклицательного знака использует / bin / sh для выполнения команд, а не мою обычную оболочку. Таким образом, все мои псевдонимы (оболочки), функции и настройки теряются. Есть идеи, как заставить ipython использовать другую оболочку? Еще одна неприятная особенность - завершение по табуляции: например, запуск myscr ‹TAB› найдет myscript.py, но не файл с именем myscript. Короче говоря, меня до сих пор не убедил ipython ... - person Gyom; 11.06.2009
comment
Да, но безуспешно: очевидно, что моих псевдонимов оболочки все еще нет, и запуск myscri ‹TAB› все еще не находит myscript без суффикса .py. Я думаю, что на данный момент я буду придерживаться zsh в терминале и обычного интерпретатора python в буфере emacs. Таким образом, я получаю правильное завершение везде, и мне не нужно возиться с ipython. возможно, однажды... - person Gyom; 15.06.2009