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

6

我正在用Python创建一个小型控制台脚本,我想在其中使用cowsay命令,但是牛会说变量名,而不是变量中的字符串。 如何让牛说出变量中的字符串?

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

9

一种简单的解决方法是直接将单词连接起来:

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

谢谢,但是"<subprocess.Popen object at 0x7fe8c7656c18>"这一行是做什么用的? - Aleksi Väisänen
这只是由Popen返回的子进程对象。您可以将其绑定到变量并与其通信。 - ch3ka
那我将它绑定到变量中,我如何与它通信?当我与它通信时,我能做什么?(是的,我是编程新手) - Aleksi Väisänen
看一下文档:https://docs.python.org/2/library/subprocess.html 你可以将数据发送到它的stdin,例如。 - ch3ka
你应该优先选择 subprocess.run() 和相关函数而不是裸的 subprocess.Popen()(在 Python 2 中为 subprocess.check_call() 等)。基本的 Popen 构造函数在你需要自己管理进程时非常有用,但如果没有必要,最好不要这样做。 - tripleee

6
你可以使用format方法构建字符串。
os.system('cowsay {}'.format(word))

或者简单的字符串拼接

os.system('cowsay ' + word)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接