假设我想在Windows批处理文件中调用程序 theprogram 。代码如下所示:
exit | theprogram arg1
我已经对它进行了测试,它完美无缺,非常感谢!
现在,战略发生了重大变化,我必须在python脚本中调用 theprogram 。为此,我使用子进程模块。我明白了:
subprocess.call(['theprogram', arg1])
但为了使其正常工作,我需要使用exit语句来管道它,正如我在批处理文件中所做的那样。当然,这不工作
subprocess.call(['exit | theprogram', arg1])
有谁知道如何将退出语句正确地传递给 theprogram 的输入?
非常感谢!
答案 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 ...