我正在用python创建小的控制台脚本,我想在其中放置cowsay命令,但是cow说的是变量的名称,字符串所在的位置,而不是变量内的字符串。我怎样才能让牛在变量中说出字符串?
if (command == 'cow'):
word = raw_input('What does the cow say? ')
os.system('cowsay word')
Run Code Online (Sandbox Code Playgroud)
懒惰的解决方案是简单地连接单词:
>>> import os
>>> word="moo"
>>> os.system('cowsay ' + word)
_____
< moo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
0
Run Code Online (Sandbox Code Playgroud)
但是你不应该这样做。如果用户输入moo; rm -rf /怎么办?猜猜会发生什么。此外,word="$(cat /etc/passwd)"和/word="$aliases"或带有反引号的单词会产生非预期的结果。
您应该使用Subprocess 模块,它负责转义 shell args 并构建调用:
>>> import subprocess
>>> subprocess.Popen(['cowsay', word])
<subprocess.Popen object at 0x7fe8c7656c18>
>>> _____
< moo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Run Code Online (Sandbox Code Playgroud)
使用.communicate()简单的调用,如在下面的示例中的文档或如所描述的。现在您不必担心注射:
>>> word="$(cat /etc/passwd)"
>>> stdout, stderr = subprocess.Popen(
['cowsay', word]).communicate()
____________________
< $(cat /etc/passwd) >
--------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Run Code Online (Sandbox Code Playgroud)
你可以format用来构造字符串
os.system('cowsay {}'.format(word))
Run Code Online (Sandbox Code Playgroud)
或者简单的字符串连接
os.system('cowsay ' + word)
Run Code Online (Sandbox Code Playgroud)
但我更喜欢前者,尤其是当字符串变得更复杂时。