【问题标题】:How to do pipeing in os.popen() ? - python如何在 os.popen() 中进行管道处理? - Python
【发布时间】:2014-01-31 09:42:51
【问题描述】:

我已经找了好几天了,但我找不到一个很好的解释来说明如何做到这一点。我正在尝试在 python 中执行以下操作:

从系统中获取时间并将其发送到一个变量,例如:

time = os.popen("date +%T").read()

然后执行以下操作:

os.system("echo time is " + time + " | festival --tts ")

当我这样做时,它会抛出一个关于“|”的错误。我已经厌倦了看 subprocess.call,但是我不知道如何使用它来将 echo 命令传递给另一个命令。

帮助?

【问题讨论】:

  • 请注意,您不必使用date +%T,请参阅下面的答案以了解更pythonic的方法。

标签: python operating-system pipe popen


【解决方案1】:

使用subprocess 模块。

主要问题是管道字符是 shell 功能,os.system 不使用 shell,而是执行原始命令。

例如,您可以使用:

import subprocess
output = subprocess.check_output("echo time is " + time + " | festival --tts ", shell=True)

在这种情况下,您需要使用 shell=True 作为关键字参数,这样它就不会抱怨管道。

注意:通常,您应该注意不要将来自不受信任来源的任何内容作为系统/shell 命令执行。在您的具体情况下,这似乎不是真正的问题,因为您仅从 date 输出组装命令,但通常它可能会导致重大安全问题。

另请注意,没有理由执行date +%T,请改用它:

import time
mytime = time.strftime("%H:%m:%S")

(请注意,在这种情况下,变量名为 mytime,以避免遮蔽时间模块)

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2015-06-08
    • 2010-09-15
    • 1970-01-01
    • 2019-06-10
    • 2017-07-16
    • 1970-01-01
    • 2011-07-19
    • 2014-12-26
    相关资源
    最近更新 更多