【问题标题】:Using pipes with the python "subprocess" module使用带有 python“子进程”模块的管道
【发布时间】:2014-01-20 14:27:38
【问题描述】:

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

exit | theprogram arg1

我已经测试过了,效果很好,非常感谢!

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

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

但要使其正常工作,我需要使用 exit 语句对其进行管道传输,就像我在批处理文件中所做的那样。当然,这不起作用工作

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

有谁知道我如何正确地将这个 exit 语句通过管道传递给 theprogram 的输入?

非常感谢!

【问题讨论】:

  • 我知道这与这个问题没有严格的关系,但是你为什么在你的批处理文件中使用exit 命令呢?为什么不只是python theprogram arg1
  • 是的,请解释为什么您需要将不存在的exit 输出通过管道传输到您的程序中。我怀疑您使用<nul theprogram arg1 会得到相同的结果
  • 我要执行的程序其实是sqlplus。当您启动它时,它会保持打开状态,等待输入命令,直到您要求它退出(通过输入 exit 输入)。我不想每次启动我的python脚本时手动输入这个exit,我希望它一旦完成就终止,因此管道:)
  • 不应该是echo exit | sqlplus ...吗?
  • echo 用于将内容打印到标准输出。如果您希望sqlplus 接收字符串exit 作为其输入,您应该使用echo exit | sqlplusexit | sqlplus 有效,因为 exit 本质上是一个空操作,用于将文件结尾发送到 sqlplus — 正如 @dbenham 正确评论的那样。

标签: python batch-file subprocess


【解决方案1】:

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

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

当然,如果 arg1 包含空格或其他 shell 的元字符,这会强制您手动引用它。通常,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 模块的示例。

【讨论】:

    【解决方案2】:

    这不是对您问题的直接回答,但它解决了您思维中的一个谬误。

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

    正确的做法是使用echo exit|sqlplus ...

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

    (call )|sqlplus ...
    

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

    <nul sqlplus ...
    

    【讨论】:

      猜你喜欢
      • 2019-12-01
      • 2014-05-29
      • 1970-01-01
      • 2012-03-21
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2011-01-22
      相关资源
      最近更新 更多