我在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