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

Ale*_*nen 5 python

我正在用python创建小的控制台脚本,我想在其中放置cowsay命令,但是cow说的是变量的名称,字符串所在的位置,而不是变量内的字符串。我怎样才能让牛在变量中说出字符串?

if (command == 'cow'):
    word = raw_input('What does the cow say?  ')
    os.system('cowsay word')
Run Code Online (Sandbox Code Playgroud)

ch3*_*3ka 7

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

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

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

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

>>> import subprocess
>>> subprocess.Popen(['cowsay', word])
<subprocess.Popen object at 0x7fe8c7656c18>
>>>  _____ 
< moo >
 ----- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Run Code Online (Sandbox Code Playgroud)

使用.communicate()简单的调用,如在下面的示例中的文档或如所描述的。现在您不必担心注射:

>>> word="$(cat /etc/passwd)"
>>> stdout, stderr = subprocess.Popen(
                     ['cowsay', word]).communicate()
 ____________________ 
< $(cat /etc/passwd) >
 -------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Run Code Online (Sandbox Code Playgroud)


Cor*_*mer 5

你可以format用来构造字符串

os.system('cowsay {}'.format(word))
Run Code Online (Sandbox Code Playgroud)

或者简单的字符串连接

os.system('cowsay ' + word)
Run Code Online (Sandbox Code Playgroud)

但我更喜欢前者,尤其是当字符串变得更复杂时。