【问题标题】:How to use python variable in os.system? [duplicate]如何在 os.system 中使用 python 变量? [复制]
【发布时间】:2015-01-23 13:59:08
【问题描述】:

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

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但是“”行有什么作用?
    • 这只是Popen返回的子进程对象。您可以将其绑定到变量并与之通信。
    • 所以我将它绑定到变量中,我可以如何与它通信?当我与它交流时我能做什么? (是的,我是编程新手)
    • 看看文档:docs.python.org/2/library/subprocess.html 例如,您可以将数据发送到它的标准输入。
    • 你应该更喜欢subprocess.run() 和朋友而不是裸露的subprocess.Popen()(Python 2 中的subprocess.check_call() 等)。基本的Popen 构造函数在您需要自己管理流程时很有用,但在不必要时您不想这样做。
    【解决方案2】:

    您可以使用format 来构造字符串

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

    或者简单的字符串拼接

    os.system('cowsay ' + word)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-02
      • 2016-05-23
      • 1970-01-01
      • 2021-10-15
      • 2021-06-10
      • 2014-04-01
      • 2021-08-20
      • 1970-01-01
      相关资源
      最近更新 更多