【问题标题】:Execute subprocess sequentially in python在python中按顺序执行子进程
【发布时间】:2017-02-12 20:42:25
【问题描述】:

我正在尝试在python中一个接一个地执行以下2个命令。

runmqsc <Queuem manager name>
Display QL (<queue name>)

我可以使用子进程执行 rumqsc 命令。

subprocess.call("runmqsc <queue manager name>", shell= True)

现在这个命令看起来像是从 python 中获取控制权。如果我尝试使用子进程执行下一个命令,它不会按预期工作。 我什至不确定如何执行第二个(为此我必须传递一个参数)。

添加代码sn-p:

subprocess.call("runmqsc Qmgrname", shell= True)
subprocess.call("DISPLAY QL(<quename>)",shell=True)

现在第一行执行良好,正如 tdelaney 在评论中提到的那样,runmqsc 等待来自标准输入的输入。并且在执行第一行之后程序挂起,甚至没有执行第二行。

任何帮助或对任何相关文档的引用都会有所帮助。 谢谢

【问题讨论】:

  • 你能在命令行上这样做吗?
  • Runmqsc 从标准输入获取命令。如果您在运行程序时不将标准输入重定向到管道或手动键入命令,它将挂起并且调用不会返回。您能否发布一个小脚本来展示您如何执行该命令,以便我们提出修复建议?
  • @tdelaney:是的,我可以在命令行中运行命令(我的意思是不使用子进程)。我试图一个接一个地直接执行命令。请找到已编辑的问题(已使用代码 sn-p 更新问题)。谢谢

标签: python unix subprocess ibm-mq


【解决方案1】:

您不想按顺序运行子进程命令。当您在命令行上运行runmqsc 时,它会接管stdin,执行您输入的命令,然后在您告诉它时最终退出。来自the docs

通过从键盘获取标准输入,您可以交互地输入 MQSC 命令。 通过重定向来自文件的输入,您可以运行一系列 文件中包含的常用命令。你也可以重定向 输出报告到一个文件。

但我认为还有第三种方式。启动runmqsc,将您的命令写入stdin,然后关闭stdin。它应该执行命令并退出。事实证明,Popen.communicate 为您完成了这项工作。我不知道你是否想捕获输出,但在这个例子中我让它进入屏幕。

# start msg queue manager
mqsc = subprocess.Popen(["runmqsc", "QMAGTRAQ01"], stdin=subprocess.PIPE,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# pass command(s) to manager and capture the result
out, err = mqsc.communicate("DISPLAY QL(BP.10240.012.REQUEST)")
# wait for command to complete and deal with errors
retcode = mqsc.wait()
if retcode != 0:
    print("-- ERROR --") # fancy error handling here
print("OUTPUT: ", out)
print()
print("ERROR: ", err)

在 python3 中,outerrbytes 对象,而不是字符串。与读取文本文件时使用编码类似,您可能必须根据程序使用的任何语言对其进行解码。假设文件是​​UTF8,那么你会

out = out.decode('utf-8')

【讨论】:

  • 非常感谢。这非常有效。请指导我如何捕捉 mqsc.communicate() 的输出。作为附加请求,请建议一些链接,我可以在其中详细了解子流程。
  • 添加了捕获输出/错误的代码。答案中的 Popen.communicate 链接转到 python 子流程文档以获取更多详细信息。
  • 感谢您的帮助。
【解决方案2】:

在 Unix、Linux 或 Windows 上,您可以这样做:

runmqsc QMgrName < some_mq_cmds.mqsc > some_mq_cmds.out

在“some_mq_cmds.mqsc”文件中,输入您的 MQSC 命令,例如:

DISPLAY QL("TEST.Q1")

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2022-08-19
    • 2010-09-26
    • 2016-12-10
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多