如何在os.popen()中进行管道输送? - 蟒蛇

时间:2014-01-12 17:25:50

标签: python operating-system pipe popen

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

从系统中获取时间并将其发送到如下变量:

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

然后执行以下操作:

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

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

帮助?

1 个答案:

答案 0 :(得分:4)

使用subprocess模块。

主要问题是管道特征是一个shell特征,os.system没有使用Shell,但执行原始命令。

例如,您可以使用:

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

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

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

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

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

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