2014-11-25 31 views
3

我在python中創建了一個小控制檯腳本,我想把cowsay命令放在裏面,但是牛說變量的名字,字符串是變量的名字,而不是變量裏面的字符串。 我怎麼能讓母牛在變量裏面說字符串?如何在os.system中使用python變量?

if (command == 'cow'): 
    word = raw_input('What does the cow say? ') 
    os.system('cowsay word') 

回答

4

懶惰的解決方案是簡單地串聯詞:

>>> import os 
>>> word="moo" 
>>> os.system('cowsay ' + word) 
_____ 
<moo> 
----- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 
0 

,但你不應該這樣做。 如果用戶輸入moo; rm -rf /會怎麼樣?猜猜會發生什麼。 此外,word="$(cat /etc/passwd)"word="$aliases"或帶反引號的詞會產生非預期的結果。

您應該使用Subprocess module,這需要逃逸殼指定參數和構建呼叫護理:

>>> import subprocess 
>>> subprocess.Popen(['cowsay', word]) 
<subprocess.Popen object at 0x7fe8c7656c18> 
>>> _____ 
<moo> 
----- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

使用.communicate()簡單的調用,如下面的示例中的文檔或描述。 現在你不必擔心注射:

>>> word="$(cat /etc/passwd)" 
>>> stdout, stderr = subprocess.Popen(
        ['cowsay', word]).communicate() 
____________________ 
< $(cat /etc/passwd) > 
-------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 
+0

謝謝,但什麼是「<在0x7fe8c7656c18 subprocess.Popen對象>」行嗎? – 2014-11-25 14:21:07

+0

這就是'Popen'返回的子進程對象。你可以將它綁定到一個變量並與之通信。 – ch3ka 2014-11-25 14:21:48

+0

因此,我將它綁定到變量中,我可以與它通信如何?當我與之交流時我能做些什麼? (是的,我是編程新手) – 2014-11-25 14:25:29

3

你可以使用format構建字符串

os.system('cowsay {}'.format(word)) 

或簡單的字符串連接

os.system('cowsay ' + word) 

但我更喜歡前者,特別是如果字符串變得更加複雜。

相關問題