如何在os.system中使用python变量?

时间:2014-11-25 14:07:06

标签: python

我在python中创建了一个小的控制台脚本,我想在其中放入cowsay命令,但是牛说的是变量的名称,其中字符串是,而不是变量中的字符串。 我如何让牛在变量中说出字符串?

if (command == 'cow'):
    word = raw_input('What does the cow say?  ')
    os.system('cowsay word')

2 个答案:

答案 0 :(得分:4)

您可以使用format构建字符串

os.system('cowsay {}'.format(word))

或简单的字符串连接

os.system('cowsay ' + word)

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

答案 1 :(得分:4)

懒惰的解决方案是简单地连接单词:

>>> import os
>>> word="moo"
>>> os.system('cowsay ' + word)
 _____ 
< moo >
 ----- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
0

但你不应该这样做。 如果用户输入moo; rm -rf /怎么办?猜猜会发生什么。 此外,word="$(cat /etc/passwd)"word="$aliases"或带有反引号的字词会产生非预期的结果。

您应该使用Subprocess module,它负责转义shell args并构建调用:

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