2013-04-10 2 views
14

Я хочу источник моего Баша среды при выполнении команды Баша от IPython с помощью оператора !, что позволяет мне доступ к моим определенным функциям Баша:выполнить команду Bash из IPython

In[2]: !<my_fancy_bash_function> <function_argument> 

В настоящее время IPython является Sourcing sh скорее чем bash:

In[3]: !declare -F 
sh: 1: declare: not found 

Как источник bash и установить свои параметры среды от IPython?

ответ

14

Фернандо Перес, создатель IPython, suggests this:

In [1]: %%bash 
. ~/.bashrc 
<my_fancy_bash_function> <function_argument> 

Это работает на текущей стабильной версии (0.13.2). Он признает, что это немного неуклюже, и приветствует pull requests. , ,

8

Если реализация ! использует IPython.utils._process_posix.system под капотом, то она будет использовать то, что which sh возвращает как оболочку обработки. Это может быть истинная реализация оболочки Bourne - это, скорее всего, Bash в некоторых режимах совместимости на многих Linux. На моем MacBook Pro, похоже, это сырье Bash оболочки:

In [12]: !declare -F 

In [13]: !echo $BASH 
/bin/sh 

In [14]: !echo $BASH_VERSION 
3.2.48(1)-release 

In [15]: import os 

In [16]: os.environ['SHELL'] 
Out[16]: '/bin/zsh' 

Я надеялся, что он будет использовать переменное окружение $SHELL но это, кажется, не сегодня. Вероятно, вы можете развернуть github repo, изменить реализацию свойства ProcessHandler.sh, чтобы заглянуть в os.environ['SHELL'] и использовать это, если оно установлено вместо вызова pexpect.which('sh'). Затем выведите запрос на вытягивание.

+0

отличный ответ, спасибо. Что, на ваш взгляд, было бы хорошим способом настройки среды в порожденном процессе, который исходит из реализации '!' (Связанного с вашим ответом)? Выполнение быстрого теста «гетто» symlinking/bin/bash to/bin/sh и выдача '! source ~/.bashrc && declare -F' ничего не дает, тогда как '! env && declare -F' правильно выводит мои объявленные переменные, но функции bash все еще недоступны ... любые идеи, что там происходит? – chris

+2

В последней версии вы можете использовать магию клеток %% bash для выполнения многострочного bash. – Matt

+0

Обнаружено что-то совершенно удивительное ... вы можете использовать простые трюки расширения 'bash' для расширения переменной, объявленной в' python'! Например, 'extension =.. Txt", за которым следует '! Ls *" $ extension "' печатает все '.txt' файлы! –

Смежные вопросы