在python中按顺序执行子进程

时间:2016-10-04 15:35:03

标签: python unix subprocess ibm-mq

我正在尝试在python中接下来的两个命令。

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

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

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

现在这个命令似乎从python中获取控件。如果我尝试使用子进程执行下一个命令,它不能按预期工作。 我甚至不确定如何执行第二个(我必须传递一个参数)。

添加代码段:

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

现在第一行执行正常,正如tdelaney在评论中所提到的,runmqsc等待来自stdin的输入。执行完第一行后,程序挂起甚至没有执行第二行。

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

2 个答案:

答案 0 :(得分:0)

在Unix,Linux或Windows上,您只需执行以下操作:

runmqsc QMgrName < some_mq_cmds.mqsc > some_mq_cmds.out

在&#39; some_mq_cmds.mqsc&#39;文件,把你的MQSC命令放在:

DISPLAY QL("TEST.Q1")

答案 1 :(得分:0)

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

  

通过从键盘获取stdin,您可以交互方式输入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')