2013-04-10 31 views
14

Tôi muốn tìm nguồn môi trường bash của tôi khi thực hiện một lệnh bash từ IPython sử dụng toán tử !, do đó cho phép tôi tiếp cận với chức năng bash định nghĩa của tôi:thực hiện lệnh Bash từ IPython

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

hiện IPython là nguồn sh thay hơn bash:

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

Làm cách nào để nguồn bash và đặt cài đặt môi trường từ IPython?

Trả lời

14

Fernando Perez, tác giả của IPython, suggests this:

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

này hoạt động trên phiên bản ổn định hiện tại (0.13.2). Ông thừa nhận đó là một chút clunky, và chào đón pull requests. . .

8

Nếu sử dụng ! sử dụng IPython.utils._process_posix.system dưới mui xe, thì sẽ sử dụng bất cứ thứ gì which sh trả về làm vỏ chế biến. Điều này có thể là sự triển khai thực sự của Bourne shell - có khả năng Bash ở một số chế độ tương thích trên nhiều Linux. Trên MacBook Pro của tôi có vẻ như đó là một vỏ Bash liệu:

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' 

Tôi đã hy vọng rằng nó sẽ sử dụng các biến môi trường $SHELL nhưng nó dường như không ngày hôm nay. Bạn có thể phân nhánh repo github, sửa đổi việc thực thi thuộc tính ProcessHandler.sh để nhìn vào os.environ['SHELL'] và sử dụng nó nếu nó được đặt thay vì gọi pexpect.which('sh'). Sau đó, đưa ra yêu cầu kéo.

+0

trả lời tuyệt vời, cảm ơn. Điều gì, theo quan điểm của bạn, sẽ là một cách tốt để thiết lập môi trường trong quá trình sinh sản đến từ việc thực hiện '!' (Được liên kết đến trong câu trả lời của bạn)? Thực hiện kiểm tra 'ghetto' nhanh chóng của symlinking/bin/bash tới/bin/sh và phát hành '! source ~/.bashrc && declaration -F' không có gì, trong khi '! env && declaration -F' in chính xác các biến đã khai báo của tôi, nhưng các hàm bash vẫn không thể truy cập được ... bất kỳ ý tưởng nào đang diễn ra ở đó? – chris

+2

Trên phiên bản gần đây, bạn có thể sử dụng phép thuật% bash cell để thực thi bash đa cấp. – Matt

+0

Phát hiện một điều gì đó khá tuyệt vời ... bạn có thể sử dụng các thủ thuật mở rộng biến bash' đơn giản để mở rộng một biến được khai báo trong 'python'! Ví dụ 'extension =". Txt "' theo sau là '! Ls *" $ extension "' in tất cả các tập tin '.txt'! –

Các vấn đề liên quan