我在python中創建了一個小控制檯腳本,我想把cowsay命令放在裏面,但是牛說變量的名字,字符串是變量的名字,而不是變量裏面的字符串。 我怎麼能讓母牛在變量裏面說字符串?如何在os.system中使用python變量?
if (command == 'cow'):
word = raw_input('What does the cow say? ')
os.system('cowsay word')
我在python中創建了一個小控制檯腳本,我想把cowsay命令放在裏面,但是牛說變量的名字,字符串是變量的名字,而不是變量裏面的字符串。 我怎麼能讓母牛在變量裏面說字符串?如何在os.system中使用python變量?
if (command == 'cow'):
word = raw_input('What does the cow say? ')
os.system('cowsay word')
懶惰的解決方案是簡單地串聯詞:
>>> 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 |
|| ||
你可以使用format
構建字符串
os.system('cowsay {}'.format(word))
或簡單的字符串連接
os.system('cowsay ' + word)
但我更喜歡前者,特別是如果字符串變得更加複雜。
謝謝,但什麼是「<在0x7fe8c7656c18 subprocess.Popen對象>」行嗎? – 2014-11-25 14:21:07
這就是'Popen'返回的子進程對象。你可以將它綁定到一個變量並與之通信。 – ch3ka 2014-11-25 14:21:48
因此,我將它綁定到變量中,我可以與它通信如何?當我與之交流時我能做些什麼? (是的,我是編程新手) – 2014-11-25 14:25:29