2011-03-28 188 views
15

有沒有辦法從Python運行BASH內置命令?在Python中運行BASH內置命令?

我嘗試:其

subprocess.Popen(['bash','history'],shell=True, stdout=PIPE) 

subprocess.Popen('history', shell=True, executable = "/bin/bash", stdout=subprocess.PIPE) 

os.system('history') 

和許多變化。我想運行historyfc -ln

+1

第二個看起來很適合我。它有什麼問題? – 2011-03-28 15:25:29

+0

運行bash過程並與之交互如何?對於長時間運行命令或與shell進行交互(即在'sudo'後輸入密碼)可能會更簡單和有用。我認爲[pexpect](http://www.noah.org/wiki/pexpect)可能適合這種需求。 – 2013-01-02 15:51:50

回答

16

我終於找到了一個可行的解決方案。

from subprocess import Popen, PIPE, STDOUT 
shell_command = 'bash -i -c "history -r; history"' 
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, 
    stderr=STDOUT) 

output = event.communicate() 

謝謝大家的意見。

+0

'shell = True'在這裏是多餘的(它開始不必要的'/ bin/sh')。你可以放棄它,並使用列表參數,如[@ lesmana's answer](http://stackoverflow.com/a/5461020/4279) – jfs 2014-05-08 21:41:42

+2

不幸的是,'-r'選項沒有得到任何當前執行的命令打開殼。 '-r'選項將〜/ .bash_history文件中的任何內容加載到剛剛打開的新shell中。但是,〜/ .bash_history文件通常只在關閉shell時更新(除非在您的.bashrc中有PROMPT_COMMAND破解)。由於您無法關閉當前正在運行的shell(爲了更新歷史文件),因此您運氣不佳。我還沒有找到解決方法。 – ishmael 2014-05-28 03:31:38

12
subprocess.Popen(["bash", "-c", "type type"]) 

這叫bash和告訴Bash運行串type type,它運行的內置命令type的說法type

輸出:type is a shell builtin

部分-c後必須是一個字符串。這將無法正常工作:["bash", "-c", "type", "type"]

+0

這適用於'type'和'alias',但不適用'history'或'fc -ln'。 – duanedesign 2011-03-29 07:11:07

+3

@duanedesign他們工作,但從子流程開始的bash會話已禁用其歷史記錄。這種行爲是通過設計。你將不得不告訴bash以某種方式啓用它的歷史。我記得前一段時間在某個stackexchange網站上讀到一個關於這個問題的問題。當我再次找到它時,我會報告回來。 – lesmana 2011-03-29 16:19:35

+1

@duanedesign http://unix.stackexchange.com/questions/5684/history-command-inside-bash-script/ – lesmana 2011-04-05 12:40:49