2014-11-25 35 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) 

但我更喜欢前者,特别是如果字符串变得更加复杂。

相关问题