我正在用Python创建一个小型控制台脚本,我想在其中使用cowsay命令,但是牛会说变量名,而不是变量中的字符串。 如何让牛说出变量中的字符串?
if (command == 'cow'):
word = raw_input('What does the cow say? ')
os.system('cowsay word')
我正在用Python创建一个小型控制台脚本,我想在其中使用cowsay命令,但是牛会说变量名,而不是变量中的字符串。 如何让牛说出变量中的字符串?
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
word="$(cat /etc/passwd)"
和word="$aliases"
或带有反引号的单词将产生非预期的结果。
您应该使用Subprocess模块,它可以负责转义shell参数和构建调用。>>> 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)
Popen
返回的子进程对象。您可以将其绑定到变量并与其通信。 - ch3kasubprocess.run()
和相关函数而不是裸的subprocess.Popen()
(在 Python 2 中为subprocess.check_call()
等)。基本的Popen
构造函数在你需要自己管理进程时非常有用,但如果没有必要,最好不要这样做。 - tripleee