2011-03-21 21 views
4

由於某些原因,我將bash腳本翻譯成python。在Python中做shell反引號?

Python是功能更強大,但是,它是更困難這樣的代碼簡單的bash代碼:

MYVAR = `grep -c myfile` 

與Python我必須先定義一個反引號功能可能是:

def backquote(cmd,noErrorCode=(0,),output=PIPE,errout=PIPE): 
    p=Popen(cmd, stdout=output, stderr=errout) 
    comm=p.communicate() 
    if p.returncode not in noErrorCode: 
     raise OSError, comm[1] 
    if comm[0]: 
     return comm[0].rstrip().split('\n') 

很無聊!

是否有Python的味道(IPython?),它很容易產生進程並獲取輸出?

回答

8

在Python 2.7或以上,有subprocess.check_output()這基本上是你在做什麼之後。

+1

++,不知道這個函數 – 2011-03-21 12:18:02

2

已定義此backquote函數,您可以從程序以及交互式shell(IPython等)中一次又一次地調用它。

沒有直接的方法來在Python中使用這種「反引號」,恕我直言,有一個很好的理由。 Python以其可讀性而聞名,並且在語言中具有這樣的構造會鼓勵不可讀的「腳本」代碼。話雖如此,backquote可能不是返回子進程輸出的函數的最具描述性的名稱。

+0

+1我的想法正好。 @Eric:定義函數時遇到的問題是什麼,稱之爲「反引用」或任何你喜歡的,並在需要時導入它? – 2011-03-21 12:00:35

4

os.subprocess documentation介紹如何更換後引號:

output=`mycmd myarg` 
==> 
output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] 
+0

這基本上是OP在做什麼,而且還檢查返回值並返回一行行... – 2011-03-21 12:00:41

+0

來自RHEL6用戶的投票。 – 2018-02-06 11:38:13

0

正如安德烈所說的那樣,你應該使用subprocess.Popen - 但無需擴展打字 - 您可以在一個單獨的文件做到這一點, 說「helper.py」你在你的腳本導入:

from subprocess import Popen, PIPE 

def r(cmd_line): 
    return Popen(cmd_line.split(), stdout=PIPE).communicate()[0] 

並在您的其他文件,你可以做到這

from helper import r 

print r("ls -l") 
print r("pwd") 
r("tar czvf new_tarball.tar.gz %s" % path_to_archive) 

請注意,如果你要通過空格 參數傳遞給shell命令這裏面簡單的方式是行不通的 - 就像一個「我的文檔」的參數 - 在這種情況下 ,要麼明確使用POPEN,或增強它可以處理它的幫助函數,所以 。用「\」弱化轉義的空白將被 忽略,我在那裏使用split

+0

使用shlex.split而不是string.split來避免引用問題。 – 2014-06-29 12:45:58

相關問題