sh簡介?
SH是一個獨特的子進程包裝器,可將您的係統程序動態映射到Python函數。SH幫助您用Python編寫Shell腳本,
既能支持Bash的所有功能(簡單的命令調用,簡單的管道傳輸) ,又能兼顧Python的靈活性。 [資源]
SH是Python中成熟的子進程接口,允許您調用任何係統程序,就好像它是一個函數一樣。也就是說,SH讓您幾乎可以調用任何可以從登錄shell運行的命令。
更重要的是,您可以更輕鬆地捕獲和解析命令的輸出。
安裝
通過pip
命令來安裝sh
$> pip install sh
用法
啟動和運行的最簡單方法是直接導入sh或從sh導入您需要的命令。然後,該命令就可以像Python函數一樣使用。
比如,傳遞參數,捕獲輸出並在python中使用輸出。詳見下麵的代碼示例
# get interface information
import sh
print sh.ifconfig("eth0")
from sh import ifconfig
print ifconfig("eth0")
# print the contents of this directory
print ls("-l")
# substitute the dash for an underscore for commands that have dashes in their names
sh.google_chrome("http://google.com")
使用sh執行命令
命令的調用就像函數一樣。
但是“需要注意的是,這些不是真正的Python函數,實際運行的是係統中對應的二進製命令,就像Bash一樣,通過解析PATH在係統上動態地運行。
也正因為這樣,Python對Shell命令的支持非常好,係統上所有命令都可以通過Python輕鬆運行。”
許多程序都有自己的命令子集,例如git(分支,簽出)。
sh通過屬性訪問處理子命令。
from sh import git
# resolves to "git branch -v"
print(git.branch("-v"))
print(git("branch", "-v")) # the same command
關鍵字參數
關鍵字參數也可以像您期望的那樣工作:它們被替換為命令行參數選項。 [資源]
# Resolves to "curl http://duckduckgo.com/ -o page.html --silent"
sh.curl("http://duckduckgo.com/", o="page.html", silent=True)
# If you prefer not to use keyword arguments, this does the same thing
sh.curl("http://duckduckgo.com/", "-o", "page.html", "--silent")
# Resolves to "adduser amoffat --system --shell=/bin/bash --no-create-home"
sh.adduser("amoffat", system=True, shell="/bin/bash", no_create_home=True)
# or
sh.adduser("amoffat", "--system", "--shell", "/bin/bash", "--no-create-home")
查找命令
“Which”查找程序的完整路徑,如果不存在,則返回None。 該命令是用Python函數真正實現的少數命令之一,
因此不依賴於實際存在的”which”二進製程序。
print sh.which("python") # "/usr/bin/python"
print sh.which("ls") # "/bin/ls"
if not sh.which("supervisorctl"): sh.apt_get("install", "supervisor", "-y")
sh還可以使用更多功能,並且可以找到所有功能。 在裏麵官方文件。
Baking參數
sh可以將”baking”參數用作命令,作用是輸出對應的完整命令行字符串,如下麵的代碼所示:
# The idea here is that now every call to ls will have the “-la” arguments already specified.
from sh import ls
ls = ls.bake("-la")
print(ls) # "/usr/bin/ls -la"
# resolves to "ls -la /"
print(ls("/"))
ssh+baking命令
在命令上調用”bake”會創建一個可調用對象,該對象會自動傳遞所有傳遞給”bake”的參數。
# Without baking, calling uptime on a server would be a lot to type out:
serverX = ssh("myserver.com", "-p 1393", "whoami")
# To bake the common parameters into the ssh command
myserver = sh.ssh.bake("myserver.com", p=1393)
print(myserver) # "/usr/bin/ssh myserver.com -p 1393"
現在,可調用“myserver”表示一個baking的ssh命令:
# resolves to "/usr/bin/ssh myserver.com -p 1393 tail /var/log/dumb_daemon.log -n 100"
print(myserver.tail("/var/log/dumb_daemon.log", n=100))
# check the uptime
print myserver.uptime()
15:09:03 up 61 days, 22:56, 0 users, load average: 0.12, 0.13, 0.05
有關更多高級功能,請參見官方文件。