2016-10-04 92 views
0

我想在python中接下来的两个命令。在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等待从标准输入。执行第一行后,程序挂起而不执行第二行。

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

+0

你可以在命令行上做到这一点? – tdelaney

+0

Runmqsc从标准输入接收命令。如果您在运行程序时未将stdin重定向到管道或手动输入命令,则它将挂起并且调用不会返回。你可以发布一个小脚本显示你如何ru命令,所以我们可以建议修复? – tdelaney

+0

@tdelaney:是的,我可以在命令行中运行命令(我的意思是不使用子进程)。我试图一个接一个地直接执行这些命令。请找到编辑的问题(已更新与代码段的问题)。谢谢 – Phoenix

回答

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') 
+0

非常感谢。这完美的作品。你能指导我如何捕捉mqsc.communicate()的输出。作为一个额外的请求,请建议一些链接,我可以详细了解子进程。 – Phoenix

+0

添加代码以捕获/ err。答案中的Popen.communicate链接转至python子流程文档以获取更多详细信息。 – tdelaney

+0

感谢您的帮助。 – Phoenix

0

在Unix,Linux或Windows,你可以简单地做:

runmqsc QMgrName <some_mq_cmds.mqsc> some_mq_cmds.out 

在 'some_mq_cmds.mqsc' 文件,把你的MQSC命令,如:

DISPLAY QL("TEST.Q1")