使用python“subprocess”模块的管道

时间:2014-01-20 14:27:38

标签: python batch-file subprocess

假设我想在Windows批处理文件中调用程序 theprogram 。代码如下所示:

exit | theprogram arg1

我已经对它进行了测试,它完美无缺,非常感谢!

现在,战略发生了重大变化,我必须在python脚本中调用 theprogram 。为此,我使用子进程模块。我明白了:

subprocess.call(['theprogram', arg1])

但为了使其正常工作,我需要使用exit语句来管道它,正如我在批处理文件中所做的那样。当然,这工作

subprocess.call(['exit | theprogram', arg1])

有谁知道如何将退出语句正确地传递给 theprogram 的输入?

非常感谢!

2 个答案:

答案 0 :(得分:3)

指定shell关键字参数以通过shell解析调用:

subprocess.call('exit | theprogram %s' % arg1, shell=True)

当然,如果它包含空格或其他shell的元字符,则会强制您手动引用arg1。通常情况下,subprocess.call不会精确调用shell,因此您无需担心引用问题 - 但在您的情况下,它会将婴儿与洗澡水一起扔掉,因为您想要 shell帮助管道操作员工作。

以牺牲一些打字为代价,保留两全其美的优秀替代方案是允许subprocess模块设置管道:

p1 = subprocess.Popen(["exit"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["theprogram", arg1], stdin=p1.stdout)
p1.stdout.close()
p2.communicate()

现在您不需要shell,也不必担心引用。 the documentation中提供了使用subprocess模块的更多示例。

答案 1 :(得分:0)

这不是你问题的直接答案,但它解决了你思想中的谬误。

您正在尝试在完成脚本运行后指示sql * plus EXIT。但这不是你的exit | sqlplus ...管道构造正在做的事情。它不会简单地将echo字符串作为输入传递给sqlplus。管道获取exit命令的输出(没有任何命令)并将其用作右侧命令的输入。

执行您尝试的操作的正确方法是使用echo exit|sqlplus ...

您的代码工作的原因是因为sqlplus检测到没有可用的其他输入(输入缓冲区已关闭),因此它在执行脚本后立即退出。您将使用左侧的任何不产生输出的命令获得相同的结果。例如:

(call )|sqlplus ...

另一种选择是简单地将输入重定向到nul

<nul sqlplus ...