2013-04-10 14 views
14

Chcę źródło mojego środowiska bash podczas wykonywania polecenia bash z ipython pomocą operatora !, co pozwala mi dostęp do moich określonych funkcji bashwykonać polecenia bash z ipython

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

obecnie ipython jest Sourcing sh raczej niż bash:

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

Jak pozyskać bash i ustawić moje ustawienia środowiska z ipython?

Odpowiedz

14

Fernando Perez, twórca ipython, suggests this:

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

Działa to na aktualnej stabilnej wersji (0.13.2). Przyznaje, że jest trochę niezgrabny i z zadowoleniem przyjmuje pull requests. . .

8

Jeśli implementacja ! używa pod maską IPython.utils._process_posix.system, to użyje tego, co zwróci which sh jako powłoki przetwarzania. Może to być prawdziwa implementacja powłoki Bourne'a - prawdopodobnie Bash jest w pewnym trybie kompatybilności na wielu Linuxach. Na mój MacBook Pro wygląda na to, że jest to surowy powłoki 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' 

Miałem nadzieję, że będzie używać zmiennej środowiskowej na $SHELL ale nie wydaje się do dzisiaj. Prawdopodobnie możesz rozgrupować repozytorium github, zmodyfikować implementację właściwości ProcessHandler.sh, aby zajrzeć do os.environ['SHELL'] i użyć tego, jeśli jest ustawione zamiast wywoływać pexpect.which('sh'). Następnie wydaj polecenie ściągnięcia.

+0

świetna odpowiedź, dzięki. Jaki, twoim zdaniem, byłby dobry sposób na ustawienie środowiska w zarodkowanym procesie, który pochodzi z implementacji '!' (Z linkami w twojej odpowiedzi)? Wykonując szybki "getto" test dowiązania symbolicznego/bin/bash do/bin/sh i wydając '! source ~/.bashrc && declare -F' nic nie daje, natomiast '! env && declare -F' poprawnie drukuje moje zadeklarowane zmienne, ale funkcje basha są nadal niedostępne ... jakiekolwiek pomysły, co się tam dzieje? – chris

+2

W najnowszej wersji możesz użyć magii komórki %% bash, aby wykonać bash wieloliniowy. – Matt

+0

Odkryłem coś niesamowitego ... możesz użyć prostych sztuczek ekspansji 'bash', aby rozwinąć zmienną zadeklarowaną w' python'! Na przykład 'rozszerzenie =". Txt "', po którym następuje '! Ls *" $ extension "' wypisuje wszystkie pliki '.txt'! –

Powiązane problemy